使用 node-http-proxy,我为路由请求设置了一个反向代理:
var httpProxy = require('http-proxy');
var server = httpProxy.createServer({
hostnameOnly: true,
router: {
'www.example.com': 'localhost:3002'
}
}).listen(80);
现在,当我在http://socket.io/#how-to-use上运行第一个示例时,套接字有时无法与客户端连接。我创建了两个文件来测试它:server.js 和 index.html。要启动节点应用程序,我运行 server.js。
server.js:
var app = require('http').createServer(handler)
, io = require('socket.io').listen(app)
, fs = require('fs')
app.listen(3002);
function handler (req, res) {
fs.readFile(__dirname + '/index.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
});
}
io.sockets.on('connection', function (socket) {
console.log("Socket connected");
});
索引.html:
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect();
setInterval(function() {
console.log(socket.socket.connected);
}, 1000)
</script>
当客户端未连接时,套接字与服务器连接后,我以 +/- 10 秒的间隔反复得到以下输出:
debug - setting request GET /socket.io/1/xhr-polling/Cqcw5xUjQ-B-Hw3FGF7Y?t=1385128607702
debug - setting poll timeout
debug - discarding transport
debug - cleared heartbeat interval for client Cqcw5xUjQ-B-Hw3FGF7Y
现在,当我刷新浏览器几次时,套接字总是与服务器连接(即它总是记录"Socket connected"),但有时它不连接客户端:有时刷新 index.js 后console.log(socket.socket.connected)
重复打印"false" 。 html,并且在另一个页面刷新后,如果套接字没有或确实与客户端连接,它可能会再次重复打印“true”或“false” 。
当我不使用反向代理时,该示例确实在客户端工作,因此当我在 www.example.com 的端口 80 上运行 server.js 时。如果有人能指出这个问题的原因,那就太好了。我正在使用 node.js v0.8.23、socket.io 版本 0.9.14 和 node-http-proxy 版本 0.10.1。
更新
可能,我实际上使用的是节点 v0.10.21。我以为我通过使用 nvm 切换节点版本来使用v0.8.23,但由于某种原因,它不断切换回 v0.10。一个已知问题是 http-proxy 不支持 0.8 之后的节点版本的 Web 套接字,因此这可能是原因。我正在使用 robertklep 的解决方案,直到找到更好的解决方案。