节点:使用https.request()

时间:2015-12-03 23:45:18

标签: node.js

我可以在使用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

运行node 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时才能完成这项工作。您能否提供一些见解,了解为什么会发生这种情况或如何在没有其他库的情况下完成这项工作?

1 个答案:

答案 0 :(得分:1)

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

我从apt-get获得的版本太旧了。