Node.js Https请求错误

时间:2012-05-27 05:28:39

标签: node.js https

我已经尝试the sample from the documentation了,效果很好。

但是当我将网址更改为https://api.mercadolibre.com/sites/时,请求会挂起。我唯一得到的是:

{ [Error: socket hang up] code: 'ECONNRESET' }

这是我的代码:

var https = require('https');

this.dispatch = function(req, res) {
  var renderHtml = function(content) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end(content, 'utf-8');
  }

  var parts = req.url.split('/');

  var options = {
    host: 'api.mercadolibre.com',
    port: 443,
    path: '/sites/',
    method: 'GET'
  };

  var request = https.request(options, function(res) {
    console.log("statusCode: ", res.statusCode);
    console.log("headers: ", res.headers);

    res.on('data', function(d) {
      process.stdout.write(d);
    });
  });

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

  request.end();
  return 'item id:' + parts[2];
};

我尝试过使用curl,soapui和浏览器。在所有情况下工作都很好,但是对于node.js它没有。

如何获得有关正在发生的事情的更多数据?

加入

卷曲我做:curl --sslv3 https://api.mercadolibre.com/sites/有效。 我在centos 6中测试过同样的功能。 我重新安装了节点,这次来自源,同样的问题。我的Os是ubuntu 12.04。 感谢。

6 个答案:

答案 0 :(得分:7)

我不确定api.mercadolibre.com网站,但如果删除port param,我可以调用API,如下面的代码:

var options = {
    host: 'api.mercadolibre.com',
    path: '/sites/',
    method: 'GET'
};

我们还需要添加param来支持SSL版本3:

https.globalAgent.options.secureProtocol = 'SSLv3_method';

答案 1 :(得分:3)

由于它正在使用curl,请尝试使用node-curl模块。我失去了一整天试图使用http和/或https模块在node.js中工作,直到我切换到node-curl。

试试这个:

var curl = require('node-curl');
curl('https://api.mercadolibre.com/sites/', {SSLVERSION: 3}, function(err, res) {
    var body = res.body;
    res.close();
    console.log(body);
});

答案 2 :(得分:2)

为什么不使用像request这样的库来处理您的详细信息?

var request = require('request');

request('https://api.mercadolibre.com/sites/', {}, function(err, res, body) {
  console.log("Got body: ", body);
});

这会产生:

Got body:  [{"id":"MLA","name":"Argentina"},{"id":"MLB","name":"Brasil"},{"id":"MCO","name":"Colombia"},{"id":"MCR","name":"Costa Rica"},{"id":"MEC","name":"Ecuador"},{"id":"MLC","name":"Chile"},{"id":"MLM","name":"Mexico"},{"id":"MLU","name":"Uruguay"},{"id":"MLV","name":"Venezuela"},{"id":"MPA","name":"Panamá"},{"id":"MPE","name":"Perú"},{"id":"MPT","name":"Portugal"},{"id":"MRD","name":"Dominicana"}]

答案 3 :(得分:1)

相同,使用curl但不使用node.js。

问题:这里使用CentOS-5 curl usesthe提供openssl库,因此使用centos standard /etc/pki/tls/certs/ca-bundle.crt进行CA检查。

node.js在哪里查找?,通过strace在那里我看不到任何对CA文件的引用进行检查。 针对具有来自知名旧发行者的有效SSL证书的服务器的Node.js请求被接受,但不接受我自己的具有自己CA的Web服务器。 我将自己的CA.crt放在ca-bundle.crt文件中,所以现在curl接受它,但不接受node.js。

现在只有解决方案是停用我的开发箱的验证检查:

    var client = require('https');
    var download_options = url.parse(sourceUrl);
    download_options.method = "GET";
    download_options.agent = false;
    download_options.rejectUnauthorized = false; / HERE to accept all SSL-certificates */

    var download_request = client.request(download_options);

答案 4 :(得分:0)

我认为您是需要指定请求的代理服务器。 libcurl自动检测代理设置,node-curl使用该设置。因此,请求传递node-curl。

因此,找出您的组织使用的代理IP和端口,并尝试:

var request = require('request');
request({
    uri : 'https://mail.google.com/mail',
    proxy : 'http://<proxy ip>:<proxy port>'
}, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body) // Print the google web page.
    }else{
        console.log(error);
        console.log(response.statusCode);
    }
})

答案 5 :(得分:0)

如果您这样做,您将收到ECONNRESET错误:

post_options.path = 'history';
...
var req = http.request(post_options, function(res) {
...

也就是说,你需要确保你的路径有这样的 /

post_options.path = '/history';
...