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



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

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

Http请求之前的其他连接用户可以继续发送消息,而不会出现任何问题。

我调试了套接字库,发现客户端套接字请求转到连接函数,然后引发错误代码:1

这是我的代码

/**
* Create Express server.
*/
const app = express();
// API endpoint
app.get('/api/test',(req,res)=>{
res.status(200).send({test:"test"});
});
/**
* Init socket
*/
// the following line not working too
// const server = require('http').createServer(app);
const server = require('http').Server(app);
const io = require('socket.io')(server);
io.on('connection', (socket) => {
// emit message to group
socket.on('emitMessage', (data) => {
io.emit('emitMessage', data);
});
});

客户端代码

import { Injectable } from '@angular/core';
import * as io from "socket.io-client/dist/socket.io.js"
import { BehaviorSubject } from 'rxjs';
@Injectable()
export class AppSocketService {
private url = 'http://localhost:28232';
private socket;
constructor() {
}
connect(){

this.socket = io(this.url,{
query:{userid:"123"},
forceNew:true,
'force new connection': true,
autoConnect: true,
reconnectionDelay: 1000,
timeout: 100000,
reconnectionDelayMax: 5000,});
this.socket.on('connect', () => {
console.log("connect",{"socketId":this.socket.id});
this.startListening();
});

}

startListening(){
this.socket.on('emitMessage', (data) => {
console.log(data);
});
}

emitMessage(message){
this.socket.emit('emitMessage', {message});
}


}

客户端版本:"socket.io-client": "^1.7.3"

服务器版本:"socket.io": "^1.7.3"

我发现了问题,包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);
});

最新更新