我在我的 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 许可协议
我用这个解决了它: