Estou usando SocketIo com Nodejs , servidor Express e MongoDB , segui a documentação. funciona bem ao conectar vários clientes, eles podem enviar mensagens entre si sem nenhum problema. quando fiz uma solicitação Http, não consigo conectar nenhum cliente novo e recebo esse erro.
socket.io.js: 7370 WebSocket conexão para
'ws: // localhost: 28232 / socket.io /? userId = userAmr & EIO = 3 & transport = websocket & sid = wNTTgrUD-PSeNaIcAAAF '
falhou: Erro durante o handshake do WebSocket: Código de resposta inesperado:
400
os outros usuários conectados antes da solicitação Http podem continuar enviando mensagens sem nenhum problema.
Eu depurei a biblioteca Socket e encontrei a solicitação de soquete do cliente, vá para a função de conexão e dispare o código de erro: 1
Este é o meu código
/**
* 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);
});
});
Esta é minha pergunta sobre estouro de pilha https://stackoverflow.com/q/47375814/6786941
encontrei o problema, o pacote express-status-monitor
estava apresentando esse comportamento errado.
tente removê-lo e funcionará perfeitamente
// comment these lines, as they making the issue
// const expressStatusMonitor = require('express-status-monitor');
// app.use(expressStatusMonitor());
O código 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);
});
Esta é minha pergunta sobre estouro de pilha https://stackoverflow.com/q/47375814/6786941
Esta é minha resposta sobre estouro de pilha https://stackoverflow.com/a/47411701/6786941
@almgwary Você, senhor, é muito bom. Eu estava enfrentando exatamente o mesmo problema. Removi o expressStatusMonitor e funcionou perfeitamente! Obrigado! Depois de muitos dias de pesquisa, finalmente consegui resolver isso depois de usar sua sugestão. Muito obrigado!
Comentários muito úteis
encontrei o problema, o pacote
express-status-monitor
estava apresentando esse comportamento errado.tente removê-lo e funcionará perfeitamente
O código final:
Esta é minha pergunta sobre estouro de pilha https://stackoverflow.com/q/47375814/6786941
Esta é minha resposta sobre estouro de pilha https://stackoverflow.com/a/47411701/6786941