node.js - WebSocket 握手响应 400,但仍然有效

标签 node.js sockets nginx websocket socket.io

我使用socket.io在我的网站中制作聊天室,在我的计算机上运行它时没有问题,但是当我在生产服务器上运行它时,socket.io.js输出以下错误:

WebSocket connection to 'ws://myWebsite.com/socket.io/?EIO=3&transport=websocket&sid=1qtzy4QRde6G-PHkAAAU' failed: Error during WebSocket handshake: Unexpected response code: 400

我使用 socket.io@1.4.5 作为服务器和客户端

该网站正在监听nginx后面的8080端口,端口为80,除了错误消息之外一切正常,但聊天室仍然正常工作,这很奇怪。

我在 Stack Overflow 上搜索了一些类似的问题,建议的解决方案已经是我的 nginx 设置(/etc/nginx/sites-enabled/myWebsite.com):

server {
        listen 80;
        server_name myWebsite.com;

        location / {
                proxy_pass http://127.0.0.1:8080;
                proxy_http_version 1.1;
                proxy_set_header Host $host;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
        }
}

Meteor WebSocket handshake error 400 with nginx Meteor WebSocket connection to 'ws://.../websocket' failed: Error during WebSocket handshake: Unexpected response code: 400

虽然聊天室仍然可以使用,但我仍然想摆脱错误消息

下面是socket.io相关代码,供您引用:

// I use angular.js as the front-end framework
function Socket (socketFactory, $rootScope) {
    var ioSocket = io.connect(window.location.host);
    var socket = socketFactory({ioSocket : ioSocket});
    return {
        on: function (eventName, callback) {
            socket.on(eventName, function () {
                var args = arguments;
                $rootScope.$apply(function () {
                    callback.apply(socket, args);
                });
            });
        },
        emit: function (eventName, data, callback) {
            socket.emit(eventName, data, function () {
                var args = arguments;
                $rootScope.$apply(function () {
                    if (callback) {
                        callback.apply(socket, args);
                    }
                });
            });
        }
    };
}
Socket.$inject = ['socketFactory', '$rootScope'];
angular.module('core').factory('Socket', Socket);

Socket.on('new message', function (data) { ... });

最佳答案

刚刚意识到我的网站正在使用 CloudFlare,由于我禁用了代理,问题就解决了。

关于node.js - WebSocket 握手响应 400,但仍然有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36482477/

相关文章:

django - 静态 CSS 和图像未在 Django 中加载

apache - Magento:Lighttpd 与 Nginx

对 PostgreSQL 表的 SQL 查询

java - 即使使用 setReuseAddress(true) 也会发生绑定(bind)错误

security - MongoDB 中的访问控制

c# - 聊天客户端发送一些奇怪的字符

c - OpenSSL ASN1_item_ex_d2i 内存泄漏

php - Nginx 和 PHP-FPM - 权限被拒绝 - Windows

node.js - 查询时node-influx的内存使用情况

node.js - 跟踪两个不同服务器之间的用户