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

Best way to Handle Exception Globally in Node.js with Express 4?

本文关键字:异常 处理 最佳 方法 全局 Express Node js 使用      更新时间:2023-09-26

AS 我们在 MVC asp.net 有异常过滤器,我们在 node 中是否有类似的功能.js也有 Express 4?

我尝试过以下文章,但没有找到所需的解决方案。

http://www.nodewiz.biz/nodejs-error-handling-pattern/

我也在下面尝试过应用程序.js

process.on('uncaughtException', function (err) {
  console.log(err);
})

参考文章: http://shapeshed.com/uncaught-exceptions-in-node/

任何帮助都是可观的。

错误可能来自不同的位置并捕获,因此建议在处理所有类型的错误的集中式对象中处理错误。例如,错误可能发生在以下位置:

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);
    }

有关更多信息,请阅读此处的项目符号 4'(+其他最佳实践以及超过 35 个引号和代码示例)

在 Express 中,标准做法是附加一个捕获所有错误处理程序。准系统错误处理程序看起来像

// Handle errors
app.use((err, req, res, next) => {
    if (! err) {
        return next();
    }
    res.status(500);
    res.send('500: Internal server error');
});

除此之外,您还需要在可能发生的任何地方捕获错误,并将它们作为 next() 中的参数传递。这将确保捕获所有处理程序捕获错误。

在节点中添加全局异常处理程序是进程上的事件。使用process.on来捕捉它们。

process.on('uncaughtException', (err) => {
   console.log('whoops! there was an error');
});

Express js v4 全局错误处理。

app.use((_req,_res,next)=>{
    const error = new Error("Not Found")
    error.status= 404;
    next(error)
})
app.use((error,_req,res,_next)=>{
    if(error.status){
        return res.status(error.status).json({
            message:error.message,
        })
    }
    res.status(500).json({message:'something wrong'})
})

编写一个中间件来处理 Express js 中的所有路由,如下所示

function asyncTryCatchMiddleware(handler){
    return async (req,res,next) => {
       try{
           await handler(req,res);
       } catch(e) {
           next(e)
       }
    };
}

你可以像这样使用中间件:

router.get('/testapi',asyncTryCatchMiddleware(async (req,res)=>{
    res.send();
}));