Error de solicitud Https de Node.js

He probado la muestra de la documentación y funciona muy bien.

Pero cuando cambio la URL a https://api.mercadolibre.com/sites/ , la solicitud se bloquea. Lo único que consigo es:

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

Aquí está mi código:

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

Lo he intentado con curl, soapui y con un navegador. En todos los casos funciona muy bien, pero con node.js no lo hace.

¿Cómo puedo obtener más datos sobre lo que está pasando?

adicional

Con curl i do: curl –sslv3 https://api.mercadolibre.com/sites/ works. He probado lo mismo en centos 6 y funciona también. He reinstalado el nodo, esta vez desde la fuente, mismo problema. Mi Os es ubuntu 12.04. Gracias.

No estoy seguro del sitio api.mercadolibre.com , pero puedo llamar a la API si api.mercadolibre.com port param, como el siguiente código:

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

Y también necesitamos agregar param para soportar la versión 3 de SSL:

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

Ya que está trabajando con curl, intente usar el módulo node-curl. Perdí un día entero intentando hacer que funcionara en node.js con módulos http y / o https hasta que cambié a node-curl.

Prueba esto:

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

¿Por qué no usar una biblioteca como solicitud para tratar los detalles por usted?

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

Esto 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"}] 

Lo mismo aquí, trabajar con curl pero no con node.js.

Problema: aquí en CentOS-5 curl usesthe proporciona bibliotecas openssl y por lo tanto usa centos estándar /etc/pki/tls/certs/ca-bundle.crt para verificaciones de CA.

¿Dónde busca node.js? A través de strace no puedo ver ninguna referencia a un archivo CA para su verificación. Se acepta la solicitud Node.js contra el servidor con un certificado SSL válido de un antiguo emisor conocido, pero no contra mi propio servidor web con CA. Puse mi propio CA.crt en el archivo ca-bundle.crt, así que ahora curl lo acepta, pero no node.js.

La única solución por ahora es desactivar la verificación de verificación de mi caja de desarrollo:

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

Creo que está detrás de un proxy que debe especificar para solicitar. Las configuraciones de proxy son detectadas automáticamente por libcurl, que utiliza el nodo curl. Por lo tanto la solicitud pasa en nodo-curl.

Por lo tanto, averigüe la IP proxy y el puerto que usa su organización, e intente esto:

 var request = require('request'); request({ uri : 'https://mail.google.com/mail', proxy : 'http://:' }, 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); } }) 

Obtendrá el error ECONNRESET si hace esto:

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

Es decir, debe asegurarse de que su ruta tenga una / como esta:

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