Node.js w / expresscallback中的error handling

我是新来的node.js和expression。 我在我的app.js文件中有以下最后的手段error handling程序:

app.use(function(err, req, res, next){ // we may use properties of the error object // here and next(err) appropriately, or if // we possibly recovered from the error, simply next(). res.status(err.status || 500); console.log(err); var errMsg = "An internal error occurred. Please notify your system administrator."; // respond with json if (req.accepts('json')) { res.send({error: errMsg}); return; } // respond with html page if (req.accepts('html')) { res.render('500', errMsg); return; } res.type('txt').send(errMsg); }); 

它在我testing的时候杀死了数据库服务器或者引发了一个“中间件”级别的错误,但是我不确定当callback接收到错误时它是否会启动? 我在callback中使用了类似这样的东西:

 if(err) { console.log(err); res.send(500, {error: err}); } 

但我想更好地坚持DRY原则,找出一种方法来处理全局(跨模块)callback内部的错误,而不是编写一堆相同的代码。 如果中间件“catchall”不起作用,我坚持每个模块的全局function? 希望这是有道理的。

看看连接域中间件。 它可以帮助您捕获asynchronouscallback,超时等内部的所有错误。仅适用于节点> 0.8.0。

现在我刚刚创build了一个全局error handling模块:

 exports.globalErrorHandler = function(err, req, res) { if(!err || !req || !res) return; console.log(err); var errMsg = "An internal error occurred. Please notify your system administrator."; // respond with json if (req.accepts('json')) { res.send({error: errMsg}); return; } // respond with html page if (req.accepts('html')) { res.render('500', errMsg); return; } res.type('txt').send(errMsg); } 

并在需要的模块中要求:

 var gh = require('../helpers/globalErrorHandler.js'); // Inside a callback if(err) { gh.globalErrorHandler(err, req, res); return; }