2012-02-10 37 views
12

Estoy trabajando con un socio en un proyecto. Escribió gran cantidad de código en Node.js + Express, pero hemos tenido problemas con la arquitectura.Cómo manejar errores en Node.js usando Express

Para remediar esto, mi función principal ha sido encontrar la mejor manera de diseñar una aplicación Node.js + Express. Me encontré con dos escenarios, que lidian con errores, y me gustaría algunas sugerencias.

En primer lugar, ¿cómo puedo capturar las excepciones de nivel superior? Lo último que quiero es que un error mate por completo el proceso del nodo. Deseo continuar atendiendo a los usuarios ante cualquier error.

En segundo lugar, algunos errores se transmiten a través de devoluciones (estamos usando). Como parte de cada controlador de ruta, o bien renderizamos una vista (GET), redirigiremos a otra ruta (POST) y deseamos redirigir a una pantalla de error con un mensaje de error personalizado. ¿Cómo puedo asegurarme de capturar esta lógica en un solo lugar?

+0

Es posible hacerlo con dominios, verifique esta respuesta: [¿Manejo de error rápido o dominio? - respuesta] [1] [1]: http://stackoverflow.com/a/27382031/923642 – JakubKnejzlik

Respuesta

13

En primer lugar, ¿cómo puedo capturar las excepciones de nivel superior? Lo último que quiero es que un error mate por completo el proceso del nodo. Deseo continuar atendiendo a los usuarios ante cualquier error.

Editar: creo que la filosofía de nodo en general es que las excepciones no capturadas deben matar el proceso, y que se deben ejecutar su aplicación nodo bajo algún tipo de monitor de proceso con las facilidades de registro correspondientes. El siguiente consejo es sobre cualquier otro error que pueda encontrar en sus manejadores de rutas exprés, etc.

Express tiene un Manipulador de errores general, que debe capturar todos los errores lanzados, así como todo lo pasado como parámetro next en sus rutas/middlewares, y responda con 500 Internal Server Error.

En segundo lugar, algunos errores se transmiten a través de devoluciones (estamos usando caolan/async).Como parte de cada controlador de ruta, o bien renderizamos una vista (GET), redirigiremos a otra ruta (POST) y deseamos redirigir a una pantalla de error con un mensaje de error personalizado. ¿Cómo puedo asegurarme de capturar esta lógica en un solo lugar?

Se puede crear una costumbre handleError, que se llama en cada devolución de llamada de esta manera:

async.series(..., function(err, results) { 
    if(err) 
    return handleError(req, res, err); 
    // ... 
}); 

O usted podría pasar los errores con next(err) e implementar su controlador de errores personalizado como se describe aquí: http://expressjs.com/guide/error-handling.html

+2

The Express errorHandler NO detectar errores que ocurren fuera de la ruta de los manipuladores/middleware. Por lo tanto, si ocurre un error fuera de los manejadores 'app.use()' o 'app.get | post | put | delete()', no puede confiar en express/connect errorHandler para atraparlo. – timkg

4

excepciones de nivel superior:

Puede utilizar el uncaughtException event from process, pero por lo general no es recomendable.

A menudo las aplicaciones entrarán en un estado dañado (por ejemplo, tiene un estado que generalmente se establece, pero la excepción provocó que eso no ocurra) cuando se lanza una excepción. Entonces, solo causará más y más errores desde allí en adelante.

Un enfoque recomendado es usar algo como forever para reiniciar automáticamente la aplicación en caso de que falle. De esta manera, tendrá la aplicación en buen estado incluso después de un bloqueo.

manejo en expreso de error:

Se puede crear una nueva instancia de error y pasarlo a la siguiente devolución de llamada en la cadena.

Por ejemplo.

express.get('/some/url', function(req, res, next) { 
    //something here 
    if(error) { 
     next(new Error('blah blah')); 
    } 
}); 

Para controlar el error de aquí en adelante, puede configurar un controlador de errores. Ver express docs on error handling

3

Pedido el excelente módulo de manipulación de troncos Winston: https://github.com/flatiron/winston

permite configurar manejo de excepciones de una manera que no solo lo registrará, sino que permitirá que el proceso continúe. Y, dado que estos obviamente serían problemas serios, incluso puede configurar Winston para enviar correos electrónicos sobre tipos de eventos específicos (como excepciones).

Cuestiones relacionadas