节点:使用https.request()时无法绑定到IPv6 localAddress

当使用HTTP时,我可以绑定到localAddress ,但是一旦我切换到HTTPS,就会出现一个错误: bind EINVAL 。 请考虑这个代码:

 var http = require('http'); var https = require('https'); var options = { host:'icanhazip.com',path:'/',localAddress:'2604:a880:1:20::27:a00f',family:6 }; callback = function(response) { var data = ''; response.on('data',function(chunk) { data+= chunk; }); response.on('error',function(error) { console.log("error: "+error.message); }); response.on('end',function() { console.log(data); }); } http.request(options,callback).end(); // Works. IP:2604:a880:1:20::27:a00f https.request(options,callback).end(); // Fails. IP:2604:a880:1:20::27:a00f https.request({host:'icanhazip.com',path:'/',family:6},callback).end(); // Works. IP:2604:a880:1:20::27:a00f 

以下是运行节点v5.0.0时的错误:

 Error: bind EINVAL 2604:a880:1:20::27:a00f at Object.exports._errnoException (util.js:860:11) at exports._exceptionWithHostPort (util.js:883:20) at connect (net.js:809:16) at net.js:984:7 at GetAddrInfoReqWrap.asyncCallback [as callback] (dns.js:63:16) at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:82:10) 

工作和失败代码之间的唯一区别是设置localAddress ,具有讽刺意味的是,最后一个例子绑定到正确的IP地址,但不会让你使用localAddress

这里的问题是我必须从我的使用情况下的一个完全独立的IPv6地址的请求,并且它与HTTP正常工作,但我需要这个工作的HTTPS请求。 目前我只能使用cURL来做这个工作。 你能否提供一些见解,为什么会发生这种情况,或者我怎样才能使这项工作没有额外的图书馆?

我和你有同样的问题。 弄清楚了。 更新你的节点到最新的稳定。 他们修好了 检查它与node --version我在6.6.0 ,它的效果很好。

我从一个apt-get得到的版本太老了。