Socket.io: Nodejs Socket.io Express 调用 HTTP API 后握手失败

创建于 2017-11-19  ·  2评论  ·  资料来源: socketio/socket.io

你想要:

  • [x] 报告错误

当前行为

我将SocketIoNodejsExpress服务器和MongoDB 一起使用,我遵循了文档。 它在连接多个客户端时工作正常,它们可以毫无问题地相互发送消息。 当我发出 Http 请求时,我无法连接任何新客户端并收到此错误。

socket.io.js:7370 WebSocket 连接到
'ws:// localhost:28232/socket.io/?userId=userAmr&EIO=3&transport=websocket&sid=wNTTgrUD-PSeNaIcAAAF '
失败:WebSocket 握手期间出错:意外的响应代码:
400

Http请求之前的其他连接用户可以继续发送消息,没有任何问题。

我调试了 Socket 库,发现客户端 socket 请求转到连接函数然后触发errorCode:1

这是我的代码

/**
 * 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);
        });
});

这是我关于堆栈溢出的问题https://stackoverflow.com/q/47375814/6786941

最有用的评论

我发现了问题,包express-status-monitor正在做出这种错误的行为。

尝试删除它,它会完美地工作

 // comment these lines, as they making the issue
 // const expressStatusMonitor = require('express-status-monitor'); 
 // app.use(expressStatusMonitor());

最终代码:

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);
});

这是我关于堆栈溢出的问题https://stackoverflow.com/q/47375814/6786941

这是我对堆栈溢出的回答https://stackoverflow.com/a/47411701/6786941

所有2条评论

我发现了问题,包express-status-monitor正在做出这种错误的行为。

尝试删除它,它会完美地工作

 // comment these lines, as they making the issue
 // const expressStatusMonitor = require('express-status-monitor'); 
 // app.use(expressStatusMonitor());

最终代码:

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);
});

这是我关于堆栈溢出的问题https://stackoverflow.com/q/47375814/6786941

这是我对堆栈溢出的回答https://stackoverflow.com/a/47411701/6786941

@almgwary你,先生,太好了。 我面临着完全相同的问题。 我删除了 expressStatusMonitor,它的作用就像一个魅力! 谢谢! 经过很多天的搜索,我终于在使用您的建议后解决了这个问题。 万分感谢!

此页面是否有帮助?
0 / 5 - 0 等级