2017-06-13 62 views
0

我正在通过节点https module发出https请求,其中我设置了localAddress option。列表中的每个本地IP映射到不同的公有IP。响应回调中的节点https请求选项

我只是试图打印在互联网上的对应的本地IP旁边的服务器报告的公共IP。问题是我不知道怎么弄的响应回调请求选项:

var https = require('https'); 

var localIps = [ 
    '192.168.88.135', 
    '192.168.88.136', 
    '192.168.88.137', 
    '192.168.88.138', 
    '192.168.88.139', 
]; 

for(index in localIps) { 
    var localIp = localIps[index]; 

    var options = { 
     localAddress: localIp, 
     host: 'mypublicserver.com', 
     path: '/whats-my-ip.php' 
    }; 

    https.get(options, function(res) { 
     res.on('data', function(d) { 
      console.log(
       // XXX localIp is always printing the last IP from localIps 
       'Local Network IP: ' + localIp + 
       ' Public Outbound IP: ' + d); 
     }); 

    }).on('error', function(e) { 
     console.error(e); 
    }); 
} 

它打印这样的事情(这是错误的)

Local Network IP: 192.168.88.139 Public Outbound IP: 88.88.888.132 
Local Network IP: 192.168.88.139 Public Outbound IP: 88.88.888.131 
Local Network IP: 192.168.88.139 Public Outbound IP: 88.88.888.130 
Local Network IP: 192.168.88.139 Public Outbound IP: 88.88.888.133 
Local Network IP: 192.168.88.139 Public Outbound IP: 88.88.888.134 

那么,如何得到正确的响应回调中的options对象?

显然reshttp.IncomingMessage instance,但我无法找到如何从中获取关联的请求对象。

回答

1

问题是for循环会在返回任何响应之前完成对localIps的迭代。所以当第一个响应返回时,localIp变量被设置为localIps数组的最后一个ip。

你可以做最简单的是在围闭的代码或也称为IIFE - >立即调用的函数表达式

var https = require('https'); 

var localIps = [ 
    '192.168.88.135', 
    '192.168.88.136', 
    '192.168.88.137', 
    '192.168.88.138', 
    '192.168.88.139', 
]; 

for(index in localIps) { 
    var localIp = localIps[index]; 

    var options = { 
     localAddress: localIp, 
     host: 'mypublicserver.com', 
     path: '/whats-my-ip.php' 
    }; 

    (function(opts){ 

     https.get(opts, function(res) { 
      res.on('data', function(d) { 
       console.log(
        // XXX localIp is always printing the last IP from localIps 
        'Local Network IP: ' + opts.localAddress + 
        ' Public Outbound IP: ' + d); 
      }); 

     }).on('error', function(e) { 
      console.error(e); 
     }); 

    })(options); 
} 

要了解更多https://www.google.cz/search?q=javascript+for+loop+closure