Pregunta

Tengo una aplicación Node.js que quiero usar para comprobar si un sitio en particular está en marcha y devuelve el código de respuesta adecuada. Quiero ser capaz de detectar los errores que se presentan como el nombre de dominio no está resolviendo o la solicitud es el tiempo de espera. El problema es que esos errores es causa de nodo a mierda. Soy nuevo en toda esta metodología de programación asincrónica, así que no estoy seguro de dónde poner mis instrucciones try / catch.

Tengo una llamada AJAX que va a algo como / cheque / sitio1. del lado del servidor que llama a una función que intenta establecer una conexión y después devuelven el statusCode. Es una función muy simple, y lo he envuelto cada línea en un try / catch y nunca se atrapa nada. Aquí está:

function checkSite(url){
    var site = http.createClient(80, url);
    var request = site.request('GET', '/', {'host': url});
    request.end();
    return request;
  }

A pesar de cada una de esas líneas envueltos en un try / catch, que seguirá recibiendo excepciones no capturadas como EHOSTUNREACH y así sucesivamente. Quiero ser capaz de atrapar a los y retorno que a la llamada AJAX.

Las recomendaciones sobre lo que debe probar la próxima?

¿Fue útil?

Solución

http.createClient ya no se utiliza.

Aquí está un ejemplo rápido de cómo manejar los errores utilizando el nuevo http.request:

var http = require("http");

var options = {
    host : "www.example.com"
};

var request = http.request(options, function(req) {
    ...
});
request.on('error', function(err) {
    // Handle error
});

request.end();

Otros consejos

Me tropezó con otra solución, mientras que yo estaba investigando un problema similar. http.Client emite un evento 'error' si no se puede establecer una conexión por cualquier motivo. Si se trata este caso entonces la excepción no será lanzada:

var http = require('http');
var sys = require('sys');

function checkSite(url) {
    var site = http.createClient(80, url);
    site.on('error', function(err) {
        sys.debug('unable to connect to ' + url);
    });
    var request = site.request('GET', '/', {'host': url});
    request.end();
    request.on('response', function(res) {
        sys.debug('status code: ' + res.statusCode);
    });
}

checkSite("www.google.com");
checkSite("foo.bar.blrfl.org");

Por supuesto, el error de conexión y la respuesta a la petición Ambos llegan de forma asíncrona, lo que significa que la simple devolución de la solicitud no va a funcionar. En su lugar, habría que notificar a la persona que llama de los resultados dentro de los controladores de eventos.

Por desgracia, en la actualidad no hay manera de coger estas excepciones directamente, ya que todo el material pasa de forma asincrónica en el fondo.

Todo lo que puede hacer es coger el uncaughtException está en su propia:

var http = require('http');

function checkSite(url){
    var site = http.createClient(800, url);
    var request = site.request('GET', '/', {'host': url});
    request.end();
    return request;
}

process.on('uncaughtException', function (err) {
    console.log(err);
}); 

checkSite('http://127.0.0.1');

Lo que en este caso (puerto aviso 800) los registros:

{ message: 'ECONNREFUSED, Connection refused',
  stack: [Getter/Setter],
  errno: 111,
  syscall: 'connect' }

Node.js está todavía en desarrollo pesada y hay seguro será un gran progreso en el próximo par de meses, ahora se centran parecen estar en corregir errores de rendimiento para 3.x y haciendo la API o menos estable, ya que después de todos Node.js es principalmente un servidor para asuntos rendimiento.

Puede presentar una insecto sin embargo, pero ser advertido choques etc tienen forma de mayor prioridad de características, y la mayoría de las nuevas características que sea a través de solicitudes de tenedor de extracción.

También para el actual Plan de trabajo de Node.js ver esta charla por Ryan Dahl (creador de Node):
http://developer.yahoo.com/yui/theater/video .php? v = yuiconf2010-Dahl

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top