繁体   English   中英

带有Socket.io的Node.js-长轮询失败,并抛出“代码”:1,“消息”:“会话ID未知”响应

[英]Node.js with Socket.io - Long Polling fails and throws “code”:1,“message”:“Session ID unknown” response

我一直坚持为什么为什么将移至IIS7服务器的nod​​e.js应用程序失败。 我知道IIS7不支持Web套接字,但我的理解是,如果Web套接字不可用,socket.io将退回到长时间轮询。 因此,现在当用户尝试按下通常需要套接字或长时间轮询的特定按钮时,我得到如下信息:

XHR finished loading: POST "https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777964357-6&sid=QWsESi0c9ih7WMWKAAAC".
GET https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777963494-5&sid=QWsESi0c9ih7WMWKAAAC 400 (Bad Request)
XHR finished loading: GET "https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777963494-5&sid=QWsESi0c9ih7WMWKAAAC".
OPTIONS https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777965127-7&sid=QWsESi0c9ih7WMWKAAAC 
XMLHttpRequest cannot load https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777965127-7&sid=QWsESi0c9ih7WMWKAAAC. Invalid HTTP status code 400

当我单击GET或XMLHttpRequest时,我看到响应是"code":1,"message":"Session ID unknown" ,我看不到,因为我看到了SID。 当我单击列出的失败选项的代码时,我看到问题出在Request.prototype.create,即xhr send:

xhr.send(this.data);

有谁知道会导致这些事情的原因吗?

任何澄清将不胜感激!

非常感谢!

对于socket.io v2.0.3(js客户端),当在客户端上使用socket.io时,客户端socket.io会进行一些网络调用,如下所述:

  1. 调用io.connect()时,socket.io库将对服务器进行如下调用:

    ?EIO=3&transport=polling&t=LqtOnHh

    服务器响应类似

    "90:0{"sid":"pcJM_AEZirrJT-DuAAUy","upgrades[], "pingInterval":3600000,"pingTimeout":3600000}2:40"

    在这里,服务器在服务器端生成一个套接字对象,并将其ID发送回客户端。

  2. 在此客户端再次调用服务器之后,类似于

    ?EIO=3&transport=polling&t=LqtR6Rn&sid=0JFGcEFNdrS-XBZeAAXM

    这是客户端对服务器进行的长时间轮询调用,如果您在此处看到它正在传递它在上面的第一个调用中接收到的sessionId,如果该调用转到生成该sessionId的同一节点,则该节点标识为其建立的套接字连接该请求已提出并做出响应。

    但是在ELB之后,该呼叫可能会转到其他未生成此sessioId的节点,在这种情况下,该节点将无法识别进行呼叫的sessionId,因此将以{"code":1,"message":"Session ID unknown"}响应{"code":1,"message":"Session ID unknown"}

如果长时间的投票没有得到回答或超时,您还将看到此错误。

在我的项目中,我尝试将transport选项添加为websocket并且错误不再出现。

io.connect(url, {
   "transports": ['websocket']
})

支持IE和其他旧的浏览器将是一个问题,因为它们不支持本机websocket,如果应用程序浏览器的兼容性不是问题,那么这似乎是一个解决方案。

如果使用Socket.io-Redis,则看起来像Socket.io的错误跟踪器中描述的情况:

https://github.com/socketio/socket.io/issues/1739#issuecomment-64244359

对我来说,它与nginx ssl http2一起使用,并且正在轮询,因此好的配置是:

 const ioSocket = io('', {
      // Send auth token on connection, you will need to DI the Auth service above
      // 'query': 'token=' + Auth.getToken()
      path: '/socket.io',
      transports: ['websocket'],
      secure: true,
    });

Web套接字连接最近在socket.io上发生了相同的错误: {"code":1,"message":"Session ID unknown"} ,尽管设置有所不同(nginx + passenger + nodejs)。 问题是我的NodeJS应用中存在从NodeJS到Redis的断开连接。 因此,一旦Redis正确启动(这是一个IP绑定问题),socket.io就开始通过Web套接字正确通信。 如果您遇到同样的问题,请检查您的NodeJs应用是否正常运行(例如,它连接到所有必需的资源)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM