我正在尝试使用以下代码使用socket.io和socket.io-client节点模块从一台服务器(充当主服务器)连接到另外两台服务器(充当从服务器,两者都具有相同的代码):
var ioClient = require('socket.io-client');
var hosts = require('./hosts');
var x = {}
for (var i in hosts.get) {
var name = 'ns' + i;
x[name] = ioClient.connect(hosts.get[i].url, { 'force new connection':true });
x[name].on('connect', function() {
console.log(x[name].socket.options.host + ' connected')
});
}
如您所见,我正在尝试连接到X个不同的服务器(在文件hosts.js中定义)并将每个套接字存储在一个对象中。
问题是,尽管我能够连接,但所有套接字似乎都来自最后一个主机,所以我最终会这样:
host2.pc.gg.edu connected
host2.pc.gg.edu connected
当预期值为:
时host1.pc.gg.edu connected
host2.pc.gg.edu connected
我已经尝试断开host1,然后输出结束了这个:
host2.pc.gg.edu connected
所以我认为问题是socket没有正确建立字段“options.host”
当我执行相同的代码时,有趣的部分来了,但是使用eval而不是在对象中使用变量键:
var ioClient = require('socket.io-client');
var hosts = require('./hosts');
var x = {};
for (var i in hosts.get) {
eval('x.ns' + i + '= ioClient.connect(hosts.get[' + i + '].url, { "force new connection":true });x.ns' + i + '.on("connect", function() {console.log(x.ns' + i + '.socket.options.host + " connected")});');
}
令人惊讶的是,这是有效的,我无法区分这两个代码。我确信这可能是一个JavaScript错误而不是socket.io错误,但是经过几个小时的努力后我无法找到解决方案......
非常感谢
答案 0 :(得分:3)
套接字连接正常,问题在于连接回调。更具体地说,到实际调用回调时,for循环已经完成,变量i
和随后的变量name
将指向最后一个元素。你可以通过在循环的每次迭代周围创建一个闭包来解决这个问题,从而在回调范围内保留i
的当前值。
for (var i in hosts.get) {
var name = 'ns' + i;
(function (name) {
x[name] = ioClient.connect(hosts.get[i].url, { 'force new connection':true });
x[name].on('connect', function () {
console.log(x[name].socket.options.host + ' connected')
});
})(name);
}