我使用 socket.io
在我的node.js
在 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
我进行了一项研究 (issue referenced here),结果发现这是因为我的应用程序/托管服务提供商阻止了 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
在我的 node.js 应用程序中激活服务器而不是 https
?但我不想切换到那个,因为我不知道我的证书存储在哪里,我不想过多地更改后端代码。
更新 (21/10/2018): 我们发现问题是 with nginx server并且由于一些不允许用户编辑 nginx 服务器的托管服务提供商的限制,基于安全协议(protocol)的 websockets 被阻止或出现 400 错误。最好在 sockets.io 中解决这个问题,因为这是许多用户遇到的问题。有什么想法吗?
重现问题:请打开您的 Javascript 控制台并转到 https://infranodus.com/news/english
最佳答案
我用这个解决了:
var socket = io.connect("http://localhost:3000", {
forceNew: true,
transports: ["polling"],
});
关于node.js - WebSocket 连接到 'wss://' WebSocket 握手期间出错 : Unexpected response code: 400,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49575350/