web-dev-qa-db-ja.com

Express 4を使用してNode.jsでグローバルに例外を処理する最良の方法?

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/

どんな助けでもありがたいです。

15
Ashish Kumar

エラーはさまざまな場所で発生および捕捉される可能性があるため、すべてのタイプのエラーを処理する集中型オブジェクトでエラーを処理することをお勧めします。たとえば、次の場所でエラーが発生する可能性があります。

1.WebリクエストでSYNCエラーが発生した場合のExpressミドルウェア

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を超える引用符とコード例)

24
Yonatan

Expressでは、catch allエラーハンドラーをアタッチするのが標準的な方法です。ベアボーンのエラーハンドラは次のようになります。

_// Handle errors
app.use((err, req, res, next) => {
    if (! err) {
        return next();
    }

    res.status(500);
    res.send('500: Internal server error');
});
_

これに加えて、エラーが発生する可能性のある場所でエラーをキャッチし、next()にパラメータとして渡す必要があります。これにより、catch allハンドラーがエラーを確実にキャッチします。

6
Swaraj Giri