node.js - WebSocket 连接到 'wss://' WebSocket 握手期间出错 : Unexpected response code: 400

标签 node.js sockets nginx websocket socket.io

我使用 socket.io在我的node.jsexpress 上运行的应用程序.

本地版本 ( 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

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

最佳答案

我用这个解决了:

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/

相关文章:

javascript - 检查值在编辑函数中返回未定义

node.js - 使用 Firebase 获取 downloadURL 不断抛出错误 'XMLHttpRequest is not defined'

javascript - 从 "run time"中的外部脚本加载 React JS 组件

sockets - 套接字:I/O错误32

asp.net-core - MailKit.Security.SslHandshakeException : The host name did not match the name given in the server's SSL certificate. asp.net 核心 5,nginx

nginx - 使用 HTTPS 重写通配符域

angular - 无法在 ubuntu 上使用 Nginx 将域分配给特定端口上的 Angular 项目

node.js - mongoose批量操作

c++ - 使用 send(sock, wszBuffer, ...) 发送 TCHAR 缓冲区?

c# - 为什么在调用 Socket.BeginSend 后我的发送回调执行得如此之快?