2012-05-27 26 views
6

ho provato the sample from the documentation e funziona benissimo.Node.js Https richiesta Errore

Ma quando cambio l'URL https://api.mercadolibre.com/sites/, la richiesta si blocca. L'unica cosa che ottengo è:

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

Ecco il mio codice:

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

Ho provato con l'arricciatura, SoapUI e con un browser. In tutti i casi funziona alla grande, ma con node.js no.

Come posso ottenere più dati su quello che sta succedendo?

aggiunto

con l'arricciatura faccio: ricciolo --sslv3 https://api.mercadolibre.com/sites/ opere. Ho provato lo stesso in centos 6 e funziona anche. Ho reinstallato il nodo, questa volta dalla fonte, lo stesso problema. My Os è Ubuntu 12.04. Grazie.

+0

Avrai bisogno di mostrare u s che stai utilizzando in modo che possiamo diagnosticare il problema. – Ashe

risposta

2

perché non utilizzare una libreria come request a che fare con i dettagli per voi?

var request = require('request'); 

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

Questo produce:

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

Esattamente la stessa cosa. Come posso ottenere più dati su cosa sta succedendo? –

+0

Quando dici "Esattamente la stessa cosa", intendi che vedi '{[Errore: socket hang up] code: 'ECONNRESET'}' di nuovo? Sembra che potrebbero bloccare l'accesso dal tuo IP, o qualcosa del genere. – Ashe

+0

sì esattamente lo stesso. Non penso in qualcosa che blocca il mio IP, forse qualcosa che blocca la richiesta node.js. Per ora sono exec curl all'interno del nodo script (e funziona) mentre realizzo cosa succede. C'è un modo per ottenere maggiori informazioni su cosa blocca la mia richiesta? –

0

penso che ci si trova dietro un proxy, che è necessario specificare per richiedere. Le impostazioni proxy vengono rilevate automaticamente da libcurl, che usa node-curl. Quindi la richiesta passa in node-curl.

Pertanto, scoprire l'IP proxy e la porta l'organizzazione utilizza, e provare questo:

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

Poiché si sta lavorando con l'arricciatura, provare a utilizzare il modulo nodo-curl. Ho perso un'intera giornata cercando di farlo funzionare in node.js con i moduli http e/o https fino a quando non sono passato a node-curl.

Prova questo:

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

io non sono sicuro di api.mercadolibre.com sito, ma posso chiamare API se tolgo port param, come codice seguente:

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

E abbiamo anche bisogno di aggiungere param per supportare SSL versione 3:

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

Il 'SSLv3_method' mi ha aiutato a risolvere un problema di 2 anni! Molte grazie! –

1

Lo stesso qui, lavorando con arricciatura ma non con node.js.

Problema: qui su CentOS-5 curl usesthe fornisce librerie openssl e quindi utilizza centos standard /etc/pki/tls/certs/ca-bundle.crt per i controlli CA.

Dove cerca node.js ?, tramite strace non riesco a vedere alcun riferimento a un file CA per il controllo. La richiesta Node.js contro server con certificato SSL valido dal vecchio emittente conosciuto è accettata, ma non contro il mio server web con la propria CA. ho messo la mia ca.crt nel file ca-bundle.crt, così ora ricciolo accetta, ma non node.js.

unica soluzione per ora è quello di disattivare la verifica-controllo per il mio 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

Si otterrà l'errore ECONNRESET se si fa questo:

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

Che è, si è necessario assicurarsi che il percorso ha un / come questo:

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