Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Socket.io客户端连接到多个服务器_Javascript_Node.js_Socket.io_Eval - Fatal编程技术网

Javascript Socket.io客户端连接到多个服务器

Javascript Socket.io客户端连接到多个服务器,javascript,node.js,socket.io,eval,Javascript,Node.js,Socket.io,Eval,我正在尝试使用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.con

我正在尝试使用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
所以我认为问题在于套接字没有正确地建立字段“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错误,但经过数小时的尝试,我无法找到解决方案


非常感谢

套接字连接正常,问题在于on connect回调。更具体地说,在实际调用回调时,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);
}