2012-05-27 12 views
6

He intentado the sample from the documentation y funciona muy bien.Node.js Https request Error

Pero cuando cambio la URL a https://api.mercadolibre.com/sites/, la solicitud se cuelga. 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]; 
}; 

He tratado con rizo, soapUI y con un navegador. En todos los casos funciona muy bien, pero con node.js no funciona.

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

añade

Con rizo hago: rizo --sslv3 https://api.mercadolibre.com/sites/ obras. He probado lo mismo en centos 6 y también funciona. He reinstalado el nodo, esta vez desde el origen, el mismo problema. My Os es ubuntu 12.04. Gracias.

+0

tendrá que mostrar u Es el que está usando para que podamos diagnosticar el problema. – Ashe

Respuesta

2

¿Por qué no utilizar una biblioteca como request para ocuparse de los detalles para 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"}] 
+0

Exactamente lo mismo. ¿Cómo puedo obtener más información sobre qué está pasando? –

+0

Cuando dice "Exactamente lo mismo", ¿quiere decir que ve el código '{[Error: socket colgar]]: 'ECONNRESET'}' nuevamente? Parece que podrían estar bloqueando el acceso desde su IP, o algo así. – Ashe

+0

sí exactamente lo mismo. No creo en algo que bloquee mi ip, tal vez algo bloqueando la solicitud de node.js. Por ahora soy Exec Curl dentro del script del nodo (y funciona) mientras me doy cuenta de lo que sucede. ¿Hay alguna manera de obtener más información sobre lo que está bloqueando mi solicitud? –

0

creo que estás detrás de un proxy, que es necesario especificar a solicitar. La configuración de proxy se detecta automáticamente por libcurl, que node-curl usa. Por lo tanto, la solicitud pasa en nodo-curl.

Por lo tanto, averiguar la IP y el puerto del proxy utiliza su organización, y probar este:

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

Desde que está trabajando con rizo, intente utilizar el módulo de nodo-rizo. Perdí todo un día intentando que funcionara en node.js con los módulos http y/o https hasta que cambié a nodo-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); 
}); 
7

No estoy seguro acerca de api.mercadolibre.com sitio, pero puedo llamar a la API si quito port parámetro, como siguiente código:

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

Y también es necesario añadir param para admitir SSL versión 3:

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

¡El 'SSLv3_method' me ayudó a resolver un problema de 2 años! ¡Muchas gracias! –

1

Igual aquí, trabajando con curl pero no con node.js.

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

¿Dónde se busca node.js ?, a través de strace no veo ninguna referencia a un archivo CA para verificar. Se acepta la solicitud de Node.js contra el servidor con un certificado SSL válido de un antiguo emisor bien conocido, pero no contra mi propio servidor web con una CA propia. Pongo mi propio CA.crt en el archivo ca-bundle.crt, por lo que ahora curl lo acepta, pero no node.js.

La única solución por ahora es para desactivar la verificación de comprobación para mi dev-cuadro:

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

obtendrá el error ECONNRESET si hace esto:

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

Es decir, se necesitará asegurarse de que el camino tiene un / así:

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