Node.js 应用程序使用 socket.io-client 无法连接。

6

背景

我有一个使用socket.io的Node.js服务器,通过HTTPS接受来自客户端的连接。

我知道这个服务器能够工作,因为我可以通过浏览器连接它。

问题

问题是我无法创建一个Node应用程序作为客户端连接到这个服务器。

我正在使用以下代码:

const io = require("socket.io-client");

const socket = io.connect("https://my.website.com:3002", { secure: true, reconnect: true });

socket.on("connect", function(){
    console.log("connected");
});

socket.on("disconnect", function(){
    console.log("disconnected");
});

socket.on("error", console.error);

服务器未注册连接,并且此应用程序未记录任何错误。看起来我连接到了错误的服务器,但是当我使用浏览器时,相同的URL却可以正常工作。

研究

我在github和官方文档中搜索了答案。即使是类似的stackoverflow问题似乎也不起作用:

问题

我做错了什么?


我在浏览器上有完全相同的代码,它可以正常工作。这是我难以理解的地方。 - Flame_Phoenix
顺便说一句,我也运行了你的代码,结果没有输出 :D - Roland Starke
1
我在加入以下代码后得到了输出:socket.on("connect_error", function(e){ console.log("connect_error", e); });并等待了20秒。看起来 error 事件并不会被所有类型的错误触发 -.- - Roland Starke
1
@RolandStarke 那些信息非常珍贵。谢谢! - Flame_Phoenix
我认为特别提到标题中使用 https 很重要,因为我花了两天时间寻找这个解决方案。 - RozzA
2个回答

19

答案

在意识到并非所有错误都会反馈到"error"事件(特别感谢@RolandStarke),我发现我正在进行一致的XHR池请求:

{ Error: xhr poll error
    at XHR.Transport.onError (/Users/pedro/Workspace/backend-stresser/node_modules/engine.io-client/lib/transport.js:64:13)
    at Request.<anonymous> (/Users/pedro/Workspace/backend-stresser/node_modules/engine.io-client/lib/transports/polling-xhr.js:128:10)
    at Request.Emitter.emit (/Users/pedro/Workspace/backend-stresser/node_modules/component-emitter/index.js:133:20)
    at Request.onError (/Users/pedro/Workspace/backend-stresser/node_modules/engine.io-client/lib/transports/polling-xhr.js:310:8)
    at Timeout._onTimeout (/Users/pedro/Workspace/backend-stresser/node_modules/engine.io-client/lib/transports/polling-xhr.js:257:18)
    at ontimeout (timers.js:469:11)
    at tryOnTimeout (timers.js:304:5)
    at Timer.listOnTimeout (timers.js:264:5) type: 'TransportError', description: 503 }

一旦我获得了这些信息,我进行了快速搜索,找到了似乎是一个错误的解决方案:

现在我正在使用的代码是:

const socket = io.connect("https://my.website.com:3002", { secure: true, reconnection: true, rejectUnauthorized: false });

而且它按预期工作。


3
撞了两天墙,这个答案救了我。其他我找到的任何示例/答案都没有展示如何使用https来实现。 - RozzA
很高兴知道我有帮到你 :P - Flame_Phoenix
@Flame_Phoenix 我收到了 "解析错误" HPE_INVALID_CONSTANT,有什么线索吗? - user269867
2
对我来说,关键是 rejectUnauthorized: false,因为我正在使用自签名证书。 - user5365075

3

我在客户端使用了这段代码,它起作用了:

import io from "socket.io-client"
const SERVER = "http://localhost:5000"
const socket = io(SERVER, { transports: ["websocket"] })

在套接字构造函数中添加传输参数对我帮助很大!谢谢! - Franciszek Job

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接