我正在使用 SocketIo 与 Nodejs , Express 服务器和 MongoDB ,我按照文档进行操作。连接多个客户端时它可以正常工作,它们可以毫无问题地相互发送消息。当我发出Http请求时,我无法连接任何新客户端并收到此错误。
socket.io.js:7370 WebSocket连接到 ' WS://本地主机:28232 / socket.io /用户id = userAmr&安培; EIO = 3及运输=网页套接字&安培; SID = wNTTgrUD-PSeNaIcAAAF' 失败:WebSocket握手期间出错:意外的响应代码: 400
其他连接用户在Http请求之前可以继续发送消息而没有任何问题。
我调试了Socket库,发现客户端套接字请求转到connect函数然后触发errorCode: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"
答案 0 :(得分:1)
我发现了问题,包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);
});