node.js - parser - Express 3 error middleware no se llama
express use (3)
Estoy intentando configurar el manejo de errores para mi aplicación Express y encontré el siguiente problema.
Definí un middleware de error y lo agregué como el último middleware:
// error handler
app.use(function(err, req, res, next) {
console.log(''JUST TESTING. ERROR HANLDER HAS BEEN CALLED...'');
next(err);
});
Ahora espero que se llame a este middleware cada vez que ocurra un error:
app.get(''/datenschutz'', function(req, res, next){
return next(new Error(''Just testing'')); // handle everything here
});
Sin embargo mi middleware nunca se llama! Sin embargo, el navegador muestra el seguimiento de la pila. Parece que hay otro middleware que captura este error y lo procesa antes de que pueda hacer algo al respecto.
El problema es que no tengo ni idea de dónde podría definirse este middleware, ya que tengo una configuración muy simple:
// setup ssl for local testing
var
app = express();
app.
use(express.static(__dirname + ''/public'')).
use(express.bodyParser()).
use(express.cookieParser());
¿Por qué no se llama a mi middleware de manejo de errores? ¿Dónde está ocurriendo este manejo de errores ''predeterminado''?
¡Gracias!
* EDIT * Veo que el middleware está funcionando. Sin embargo, este es el caso si lo llamo desde otra función de middleware. Sin embargo, no se invoca si el error se produce dentro de una función definida como una ruta expresa (GET, POST, etc.). Esto es muy extraño. Si agrego mi middleware de error a las devoluciones de llamada de ruta, entonces funciona:
app.get(''/testError'', function(req, res, next){
return next(new Error(''Just testing'')); // handle everything here
}, function(err,req,res,next) {
console.log(''This error handler is called!!'');
return next();
});
* EDICIÓN 2 - ENCONTRADO ENCUENTRO ACEPTABLE ENCONTRADO ** Me sorprende que haya que hacerlo de esta manera. Como había leído muchas entradas / preguntas sobre el manejo de errores en Express y nunca encontré esta posibilidad mencionada. Sin embargo, parece que si se produce un error dentro de una ruta, los manejadores de middleware de error regular de devolución de llamada no lo detectarán. Deberá definir un manejador de errores en el nivel de ruta.
app.all(''*'', function(err,req,res,next) {
console.log(''This is a global error handler at route level....'');
return next(err);
});
EDIT 2 (sabtioagoIT) funciona. Pero solo para aquellos que se lo perdieron, la solución de emostar también funciona. Comprendí que mover la llamada de ''uso'' del manejo de errores al final, pero parece que hay una opción más fácil como sugiere emoster, usar app.router (antes de la llamada de ''uso'' del manejo de errores).
Respuesta actualizada para los usuarios de Express 4 de los documentos de Express 4 . Vea el ejemplo de los documentos a continuación. Tenga en cuenta que app.router
está en desuso y ya no se utiliza. También agregué una ruta ficticia para aclarar el pedido:
"Usted define el middleware de manejo de errores al final, después de otro app.use () y enruta las llamadas; por ejemplo:
var bodyParser = require(''body-parser'');
app.use(bodyParser());
app.get(''/'', function(req, res) {
res.send(''hello world'');
})
app.use(function(err, req, res, next) {
// logic
});
"
También tuve este problema, pero no pude averiguar por qué no funcionaba a pesar de que configuré mi controlador de errores después de app.user(app.router)
. Resulta que ya tenía un controlador de errores del que no tenía conocimiento.
Específicamente, si usa el cli express para generar una aplicación como la que hice, se agregará automáticamente en esto:
if (''development'' == app.get(''env'')) {
app.use(express.errorHandler());
}
Desafortunadamente para mí, agregué un poco más de middleware a mi aplicación, lo que en consecuencia ocultó esta afirmación y, por lo tanto, impidió que se llamara a mi controlador de errores personalizado.
Simplemente quite eso y luego debería funcionar correctamente.
En una nota al margen, debo mencionar que la solución original todavía funcionó, incluso con la app.use(express.errorHandler())
.
app.all(''*'', function(err,req,res,next) {
console.log(''This is a global error handler at route level....'');
return next(err);
});