J'utilise SocketIo avec Nodejs , Express server et MongoDB , j'ai suivi la documentation . cela fonctionne très bien lors de la connexion de plusieurs clients, ils peuvent s'envoyer des messages sans aucun problème. lorsque j'ai fait une demande Http, je ne peux pas connecter de nouveaux clients et obtenir cette erreur.
socket.io.js:7370 connexion WebSocket à
'ws:// localhost:28232/socket.io/?userId=userAmr&EIO=3&transport=websocket&sid=wNTTgrUD-PSeNaIcAAAF '
échec : erreur lors de la négociation WebSocket : code de réponse inattendu :
400
les autres utilisateurs connectés avant la requête Http peuvent continuer à envoyer des messages sans aucun problème.
J'ai débogué la bibliothèque Socket et trouvé la demande de socket client aller à la fonction de connexion puis déclencher errorCode:1
C'est mon code
/**
* Create Express server.
*/
const app = express();
// API endpoint
app.get('/api/test',(req,res)=>{
res.status(200).send({test:"test"});
});
/**
* Init socket
*/
const server = require('http').Server(app);
const io = require('socket.io')(server);
io.on('connection', (socket) => {
// emit message to group
socket.on('emitMessage', (data, callback) => {
io.emit('emitMessage', data);
});
});
C'est ma question sur le débordement de la pile https://stackoverflow.com/q/47375814/6786941
J'ai trouvé le problème, le package express-status-monitor
faisait ce mauvais comportement.
essayez de l'enlever, et cela fonctionnera parfaitement
// comment these lines, as they making the issue
// const expressStatusMonitor = require('express-status-monitor');
// app.use(expressStatusMonitor());
Le code final :
let app = require('express')();
// these two lines were making the problem, please comment them. if you want to reproduce the problem enable them again
// const expressStatusMonitor = require('express-status-monitor');
// app.use(expressStatusMonitor());
let http = require('http').Server(app);
let io = require('socket.io')(http);
let port = process.env.PORT || 3000;
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});
app.get('/api/v0/availabilities',(req,res)=>{
res.status(200).send({test:"test"});
});
io.on('connection', (socket) => {
// emit message to group
socket.on('emitMessage', (data) => {
io.emit('emitMessage', data);
});
});
http.listen(port, function(){
console.log('listening on *:' + port);
});
C'est ma question sur le débordement de la pile https://stackoverflow.com/q/47375814/6786941
C'est ma réponse sur le débordement de la pile https://stackoverflow.com/a/47411701/6786941
@almgwary Vous, monsieur, êtes trop bon. J'étais confronté exactement au même problème. J'ai supprimé expressStatusMonitor et cela a fonctionné à merveille ! Merci! Après plusieurs jours de recherche, j'ai enfin pu résoudre ce problème après avoir utilisé votre suggestion. Merci beaucoup!
Commentaire le plus utile
J'ai trouvé le problème, le package
express-status-monitor
faisait ce mauvais comportement.essayez de l'enlever, et cela fonctionnera parfaitement
Le code final :
C'est ma question sur le débordement de la pile https://stackoverflow.com/q/47375814/6786941
C'est ma réponse sur le débordement de la pile https://stackoverflow.com/a/47411701/6786941