【发布时间】:2016-07-28 16:57:21
【问题描述】:
我用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) { ... });
【问题讨论】:
-
那么socket是怎么连接的呢?是发送第二个请求吗?它甚至是升级到 websockets 还是备份到 xhr?
-
我真的不知道这是怎么回事,我只是打开了两个浏览器选项卡,它们都有 400 响应,但都可以接收来自对方的消息
标签: node.js sockets nginx websocket socket.io