8

我已经尝试过文档中的示例,效果很好。

但是当我将 URL 更改为 时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: curl --sslv3 https://api.mercadolibre.com/sites/有效。我在centos 6中测试过同样的东西并且也可以工作。我已经从源头重新安装了节点,同样的问题。我的操作系统是 ubuntu 12.04。谢谢。

4

6 回答 6

7

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

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

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

https.globalAgent.options.secureProtocol = 'SSLv3_method';
于 2012-11-27T16:57:25.680 回答
3

由于它与 curl 一起使用,请尝试使用 node-curl 模块。在我切换到 node-curl 之前,我花了一整天的时间试图让它在 node.js 中使用 http 和/或 https 模块工作。

尝试这个:

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);
});
于 2012-11-04T03:53:52.140 回答
3

为什么不使用请求之类的库来为您处理详细信息?

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"}]
于 2012-05-27T06:45:40.963 回答
1

同样在这里,使用 curl 但不使用 node.js。

问题:在 CentOS-5 上 curl 使用提供的 openssl 库,因此使用 centos 标准 /etc/pki/tls/certs/ca-bundle.crt 进行 CA 检查。

node.js 在哪里寻找?,通过 strace,我看不到任何对 CA 文件的引用以进行检查。接受来自知名旧发行者的具有有效 SSL 证书的服务器的 Node.js 请求,但不接受具有自己 CA 的我自己的网络服务器。我将自己的 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);
于 2013-07-09T17:02:12.227 回答
0

我认为您在需要指定请求的代理后面。代理设置由 node-curl 使用的 libcurl 自动检测。因此请求在 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);
    }
})
于 2012-07-11T10:10:33.603 回答
0

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

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

也就是说,您需要确保您的路径是/这样的:

post_options.path = '/history';
...
于 2013-10-21T20:13:13.643 回答