Dmi*_*kin 13 sockets nginx websocket node.js socket.io
我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
我做了一个研究(这里引用的问题),结果发生了这种情况,因为我的应用程序/托管提供程序阻止了类似的连接,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');
Run Code Online (Sandbox Code Playgroud)
以及我在前端文件中需要套接字的方式:
<script src="/socket.io/socket.io.js"></script>
然后
var socket = io();
也许问题是我使用http而不是在我的node.js应用程序中激活服务器https?但我不想改用它,因为我不知道我的证书存储在哪里,我不想太多地改变后端代码.
更新(21/10/2018):我们发现问题在于nginx服务器,并且由于某些托管服务提供商的限制,他们不允许用户编辑nginx服务器,因此安全协议上的websockets被阻止或得到400错误.在sockets.io中解决这个问题会很好,因为这是许多用户的问题.有任何想法吗?
重现问题:请打开您的Javascript控制台并访问https://infranodus.com/news/english
小智 6
我用这个解决了它:
var socket = io.connect("http://localhost:3000", {
forceNew: true,
transports: ["polling"],
});
Run Code Online (Sandbox Code Playgroud)
使用安全 URL 进行初始连接,即使用“https://”代替“http://”。如果选择 WebSocket 传输,则 Socket.IO 也应自动使用“wss://”(SSL) 进行 WebSocket 连接。
如果您在调用 io() 时未指定任何 URL,因为它默认尝试连接到提供该页面的主机,则您必须提供 url 或更改为 https
var socket = io.connect('https://localhost', {secure: true}); //remote url
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14627 次 |
| 最近记录: |