2011-12-28 3 views
11

cuando estoy tratando de utilizar el módulo http acceder a la acogida inexistente, así:Cómo atrapar el error http de node.js en el host inexistente?

requestToRemote = http.createClient(80, 'fjasdfhasdkfj.vvvxcz').request(
    method, 
    path, 
    headers 
); 

pero me da el siguiente error:

node.js:201 
     throw e; // process.nextTick error, or 'error' event on first tick 
      ^
Error: getaddrinfo ENOENT 
    at errnoException (dns.js:31:11) 
    at Object.onanswer [as oncomplete] (dns.js:140:16) 

me gustaría encontrar este error, así que probé try/catch y establecí los detectores de errores de un conjunto de propiedades de solicitud, pero ninguna de ellas funcionó. ¿Cómo puedo detectar el error?

Respuesta

9

Parece que el error es lanzado desde http.Client, no la solicitud. ¿Qué tal algo como:

var site = http.createClient(80, host); 
site.on('error', function(err) { 
    sys.debug('unable to connect to ' + host); 
}); 
var requestToRemote = site.request(...); 

FYI, http.createClient ya no se utiliza - el siguiente debe funcionar utilizando el método de conveniencia conseguir:

http.get({host: host}, function(res) { 
    ... 
}).on('error', function(e) { 
    console.log("Got error: " + e.message); 
}); 
+0

¿Cómo uso el valor 'res' en la devolución de llamada para ver cuál es el texto de la respuesta? –

-1

podría intentar resolver el host utilizando el módulo dns antes de ejecutar su código.

http://nodejs.org/docs/latest/api/dns.html#dns.resolve

+4

Esto no es una buena solución, ya que sería entonces involucrar a la solución de la nombre de host dos veces. Incluso cuando se almacena en caché, todavía hay una pequeña penalización que puede multiplicarse rápidamente, según las necesidades de su aplicación. Claro, puede usar la dirección de red en lugar del nombre de host cuando realiza la solicitud, pero luego debe manejar los encabezados de solicitud que especifican el host usted mismo. – Brad

Cuestiones relacionadas