Socket.io: Nodejs Socket.io Express falhou no handshake após chamar a API HTTP

Criado em 19 nov. 2017  ·  2Comentários  ·  Fonte: socketio/socket.io

Você quer:

  • [x] relatar um bug

Comportamento atual

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

Comentários muito úteis

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

Todos 2 comentários

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!

Esta página foi útil?
0 / 5 - 0 avaliações