调用HTTP API后,Nodejs Socket.io Express无法握手

时间:2017-11-19 10:26:54

标签: node.js sockets socket.io

我正在使用 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"

1 个答案:

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