使用Express 4在Node.js中处理全局异常的最佳方法?

时间:2016-02-22 10:10:01

标签: javascript jquery asp.net-mvc node.js express

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/

任何帮助都会很明显。

4 个答案:

答案 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');
});