2012-05-27 16 views
6

Próbowałem już the sample from the documentation i działa świetnie.Prośba o żądanie Https błędu Node.js

Po zmianie adresu URL na https://api.mercadolibre.com/sites/ żądanie zawiesza się. Jedyne co mi się dostać to:

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

Oto mój kod:

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

Próbowałem z curl, SoapUI iz przeglądarce. We wszystkich przypadkach działa świetnie, ale z node.js tak nie jest.

Jak mogę uzyskać więcej danych o tym, co się dzieje?

dodany

z dyni i zrobić curl --sslv3 https://api.mercadolibre.com/sites/ prac. Testowałem to samo w centos 6 i też działa. Zainstalowałem ponownie węzeł, tym razem ze źródła, ten sam problem. Mój Os to ubuntu 12.04. Dzięki.

+0

Musisz pokazać u s, którego używasz, abyśmy mogli zdiagnozować problem. – Ashe

Odpowiedz

2

Dlaczego nie korzystać z biblioteki takiej jak request, aby poradzić sobie ze szczegółami?

var request = require('request'); 

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

Daje:

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

Dokładnie to samo. Jak mogę uzyskać więcej danych o tym, co się dzieje? –

+0

Kiedy mówisz "Dokładnie to samo", masz na myśli, że widzisz komunikat '{[Błąd: socket hang up] code: 'ECONNRESET'}' ponownie? Wygląda na to, że mogą blokować dostęp z twojego adresu IP lub coś podobnego. – Ashe

+0

tak, dokładnie to samo. Nie myślę o czymś blokującym moje IP, może o coś blokującym żądanie node.js. Na razie jestem exec curl wewnątrz skryptu węzła (i działa), a ja zdaję sobie sprawę, co się stanie. Czy istnieje sposób uzyskania dodatkowych informacji na temat tego, co blokuje moją prośbę? –

0

myślę, że jesteś za serwerem proxy, które trzeba podać na życzenie. Ustawienia proxy są wykrywane automatycznie przez bibliotekę libcurl, z której korzysta lokalna funkcja curl. Dlatego żądanie przechodzi w zwinięcie węzła.

Dlatego sprawdź adres IP serwera proxy i port organizacja wykorzystuje i spróbuj tego:

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

Ponieważ pracuje z curl, spróbuj użyć modułu Node-curl. Straciłem cały dzień próbując sprawić, by działało w node.js z modułami http i/lub https, dopóki nie przełączyłem się na zwinięcie węzła.

Spróbuj tego:

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

nie jestem pewien o api.mercadolibre.com miejscu, ale mogę zadzwonić API jeśli usunąć port param, jak następujący kod:

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

I musimy również dodać Parametr obsługujący SSL w wersji 3:

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

'SSLv3_method' pomógł mi rozwiązać dwuletni problem! Wielkie dzięki! –

1

To samo dotyczy pracy z lokami, ale nie z node.js.

Problem: tutaj na curl w CentOS-5 udostępnia biblioteki openssl i dlatego używa CentOS standard /etc/pki/tls/certs/ca-bundle.crt do sprawdzania CA.

Gdzie szuka węzła ?, przez strace tam nie widzę żadnego odniesienia do pliku CA do sprawdzenia. Żądanie Node.js na serwerze z ważnym certyfikatem SSL od dobrze znanego starego wystawcy jest akceptowane, ale nie dotyczy mojego własnego serwera WWW z własnym urzędem certyfikacji. Umieściłem własny plik CA.crt w pliku ca-bundle.crt, więc teraz curl go akceptuje, ale nie node.js.

jedynym rozwiązaniem jest teraz wyłączyć weryfikację-czek na moim dev-box:

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

dostaniesz błąd ECONNRESET jeśli to zrobić:

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

Oznacza to, że trzeba upewnić się, że ścieżka ma / takiego:

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