簡體   English   中英

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

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

AS我們在asp.net MVC中有異常過濾器,我們在node.js中是否也有類似的功能與express 4?

我嘗試了以下文章,但沒有找到所需的解決方案。

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/

任何幫助將是可觀的。

錯誤可能來自並在不同位置捕獲,因此建議在處理所有類型錯誤的集中對象中處理錯誤。 例如,錯誤可能發生在以下地方:

1.Express中間件以防萬一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() 這將確保 catch all 處理程序捕獲錯誤。

在 node 中添加全局異常處理程序是process上的事件。 使用process.on來捕捉它們。

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

編寫一個中間件來處理 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();
}));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM