AS我们在asp.net MVC中有异常过滤器,我们在带有express 4的node.js中是否有类似的功能?
我尝试过以下文章,但没有找到理想的解决方案。
http://www.nodewiz.biz/nodejs-error-handling-pattern/
我也在app.js
上面尝试过process.on('uncaughtException', function (err) {
console.log(err);
})
参考文章:http://shapeshed.com/uncaught-exceptions-in-node/
任何帮助都会很明显。
答案 0 :(得分:22)
错误可能来自和捕获在各个位置,因此建议处理处理所有类型错误的集中对象中的错误。例如,以下位置可能会发生错误:
1.如果Web请求中出现SYNC错误,请执行中间件
app.use(function (err, req, res, next) {
//call handler here
});
2.CRON工作(计划任务)
3.您的初始化脚本
4.测试代码
5.来自某处的未捕获错误
process.on('uncaughtException', function(error) {
errorManagement.handler.handleError(error);
if(!errorManagement.handler.isTrustedError(error))
process.exit(1)
});
6.未处理的承诺拒绝
process.on('unhandledRejection', function(reason, p){
//call handler here
});
然后当您发现错误时,将它们传递给集中的错误处理程序:
module.exports.handler = new errorHandler();
function errorHandler(){
this.handleError = function (error) {
return logger.logError(err).then(sendMailToAdminIfCritical).then(saveInOpsQueueIfCritical).then(determineIfOperationalError);
}
有关详细信息read bullet 4' here(+其他最佳做法以及超过35个引号和代码示例)
答案 1 :(得分:5)
在express中,标准做法是附加一个catch all错误处理程序。 准系统错误处理程序看起来像
<div class="exampleDiv" data-bind="ifvisible: active()">
除此之外,您还需要在任何可能发生的地方捕获错误,并将其作为// Handle errors
app.use((err, req, res, next) => {
if (! err) {
return next();
}
res.status(500);
res.send('500: Internal server error');
});
中的参数传递。这将确保catch all handler捕获错误。
答案 2 :(得分:0)
编写一个中间件来处理快递js中所有路由的如下处理
function asyncTryCatchMiddleware(hadnler){
return async(req,res,next())=>{
try{
await handler(req,res);
}catch(e){
next(e)
}
};
}
router.get('/testapi',asyncTryCatchMiddleware(async (req,res)=>{
res.send();
})
);
答案 3 :(得分:-3)
在节点中添加全局异常处理程序是process上的事件。使用process.on
来抓住它们。
process.on('uncaughtException', (err) => {
console.log('whoops! there was an error');
});