【问题标题】:Nodejs Socket.io Express failed to handshake after calling HTTP APINodejs Socket.io Express 调用 HTTP API 后握手失败
【发布时间】:2018-05-02 17:10:59
【问题描述】:

我将 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 库,发现客户端套接字请求 go to 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"

【问题讨论】:

  • 能否请您发布您绑定 Socket.io 实例的服务器配置的相关部分?
  • @BinUry 代码添加
  • 请显示连接socket.io连接的客户端代码。
  • @jfriend00,添加了客户端代码,我认为客户端没有问题,因为它已经在 HTTP 请求之前工作了
  • 您是否在客户端和服务器上运行完全相同版本的 socket.io?

标签: node.js sockets socket.io


【解决方案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);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    相关资源
    最近更新 更多