2012-05-27 49 views
6

Tôi đã thử the sample from the documentation và nó hoạt động tốt.Yêu cầu Hodeps Node.js Lỗi

Nhưng khi tôi thay đổi URL thành https://api.mercadolibre.com/sites/, yêu cầu bị treo. Điều duy nhất tôi nhận được là:

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

Dưới đây là mã của tôi:

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]; 
}; 

Tôi đã thử với curl, soapUI và với một trình duyệt. Trên tất cả các trường hợp hoạt động rất tốt, nhưng với node.js thì không.

Làm cách nào để có thêm dữ liệu về những gì đang diễn ra?

thêm

Với curl tôi làm: curl --sslv3 https://api.mercadolibre.com/sites/ công trình. Tôi đã thử nghiệm tương tự ở centos 6 và hoạt động quá. Tôi đã cài đặt lại nút, lần này từ nguồn, cùng một vấn đề. Os của tôi là ubuntu 12.04. Cảm ơn.

+0

Bạn sẽ cần hiển thị u bạn đang sử dụng để chúng tôi có thể chẩn đoán vấn đề. – Ashe

Trả lời

2

Tại sao không sử dụng thư viện như request để giải quyết các chi tiết cho bạn?

var request = require('request'); 

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

sản lượng này:

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"}] 
+0

Chính xác điều tương tự. Làm thế nào tôi có thể nhận được nhiều dữ liệu hơn về những gì đang xảy ra? –

+0

Khi bạn nói "Chính xác cùng một điều", bạn có nghĩa là bạn thấy mã '{[[Lỗi: socket treo lên]: 'ECONNRESET'}' một lần nữa? Có vẻ như họ có thể chặn quyền truy cập từ IP của bạn hoặc một thứ gì đó. – Ashe

+0

có chính xác như nhau. Tôi không nghĩ rằng trong một cái gì đó chặn ip của tôi, có lẽ một cái gì đó chặn yêu cầu node.js. Bây giờ tôi exec curl bên trong kịch bản nút (và hoạt động) trong khi tôi nhận ra những gì xảy ra. Có cách nào để có thêm thông tin về những gì đang chặn yêu cầu của tôi không? –

0

Tôi nghĩ rằng bạn đang ở phía sau một proxy mà bạn cần phải xác định yêu cầu. Cài đặt proxy được phát hiện tự động bởi libcurl, mà nút curl sử dụng. Do đó yêu cầu chuyển qua nút-curl.

Do đó, tìm ra IP proxy và cổng tổ chức của bạn sử dụng, và cố gắng này:

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); 
    } 
}) 
3

Vì nó đang làm việc với curl, hãy thử sử dụng mô-đun nút-curl. Tôi mất một ngày cố gắng để làm cho nó hoạt động trong node.js với http và/hoặc mô-đun https cho đến khi tôi chuyển sang nút-curl.

Hãy thử điều này:

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); 
}); 
7

Tôi không chắc chắn về api.mercadolibre.com trang web, nhưng tôi có thể gọi API nếu tôi loại bỏ port param, giống như đoạn mã sau:

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

Và chúng ta cũng cần thêm param để hỗ trợ SSL phiên bản 3:

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

'SSLv3_method' đã giúp tôi giải quyết vấn đề 2 năm tuổi! Cảm ơn rất nhiều! –

1

Tương tự tại đây, làm việc với curl nhưng không có node.js.

Vấn đề: ở đây trên CentOS-5 curl usesthe cung cấp thư viện openssl và vì vậy hãy sử dụng centos standard /etc/pki/tls/certs/ca-bundle.crt để kiểm tra CA.

Tìm kiếm node.js ở đâu ?, thông qua strace ở đó tôi không thể thấy bất kỳ tham chiếu nào tới tệp CA để kiểm tra. Yêu cầu Node.js đối với máy chủ có chứng chỉ SSL hợp lệ từ nhà phát hành cũ nổi tiếng được chấp nhận, nhưng không được chấp nhận đối với máy chủ web của riêng tôi với CA riêng. Tôi đặt CA.crt của riêng mình trong tệp ca-bundle.crt, vì vậy bây giờ curl chấp nhận tệp đó, nhưng không phải node.js.

Chỉ giải pháp cho bây giờ là tắt xác minh kiểm tra cho dev-box của tôi:

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); 
0

Bạn sẽ nhận được lỗi ECONNRESET nếu bạn làm điều này:

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

Đó là, bạn cần đảm bảo đường dẫn của bạn có một số / như sau:

post_options.path = '/history'; 
... 
Các vấn đề liên quan