WebSocket 连接到“wss://”WebSocket 握手期间出错:意外的响应代码:400

新手上路,请多包涵

我在我的 node.js 上运行的应用程序中使用 socket.io express

本地版本( localhost )上的一切都很好,但是当我切换到我的生产服务器(通过 https 使用自定义证书提供服务)时,我在浏览器中收到以下错误安慰:

websocket.js:112 WebSocket connection to 'wss://infranodus.com/socket.io/?EIO=3&transport=websocket&sid=j_WBxkPY_RlpF9_ZAANP' failed: Error during WebSocket handshake: Unexpected response code: 400

我进行了一项研究( 此处引用的问题),事实证明这是因为我的应用程序/托管服务提供商阻止了诸如 wss 类的连接,而我的 socket.io 依赖于 AJAX 发出请求(功能正常,但有时会出现错误)。

所以我想问你是否可以对我的应用程序进行修改以消除此错误?

仅供参考,目前对 http://infranodus.com 的所有请求都被转发(通过静态 .htaccess)到 https://infranodus.com 和我的 app.js 文件(服务器激活的部分看起来像这样) :

 var http = require('http');

var app = express();

var server = http.Server(app);
var io = require('socket.io')(server);

app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');

以及我在前端文件中需要套接字的方式:

<script src="/socket.io/socket.io.js"></script>

接着

var socket = io();

也许问题是我使用 http 而不是 https 在我的 node.js 应用程序中激活服务器?但我不想切换到那个,因为我不知道我的证书存储在哪里,我不想过多地更改后端代码。

更新(2018 年 10 月 21 日): 我们发现问题出在 nginx 服务器上,并且由于一些不允许用户编辑 nginx 服务器的托管服务提供商的限制,通过安全协议的 websocket 被阻止或出现 400 错误。最好在 sockets.io 中解决这个问题,因为这是许多用户遇到的问题。有任何想法吗?

重现问题: 请打开您的 Javascript 控制台并访问 https://infranodus.com/news/english

源代码: https ://github.com/noduslabs/infranodus

原文由 Aerodynamika 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
1 个回答

我用这个解决了它:

 var socket = io.connect("http://localhost:3000", {
   forceNew: true,
   transports: ["polling"],
});

原文由 Paris López 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题