1. ホーム
  2. node.js

[解決済み] Node.js + Express.jsアプリケーションのエラー処理原則?

2022-04-21 21:12:11

質問

Node.js+ではエラーの報告/処理が異なるようです。 Express.js アプリケーションは、他のフレームワークと比較して 以下のように動作するという理解で合っていますか?

A) 検出 をコールバック関数のパラメータとして受け取ることで、エラーの発生を回避することができます。例えば

doSomethingAndRunCallback(function(err) { 
    if(err) { … }
});

B) 報告書 のエラーは、next(err) を呼び出すことで、MIDDLEWARE で発生します。例

handleRequest(req, res, next) {
    // An error occurs…
    next(err);
}

C) 報告書 のエラーを投げることで、ROUTESにエラーが発生する。例

app.get('/home', function(req, res) {
    // An error occurs
    throw err;
});

D) ハンドル のエラーは、app.error()で独自のエラーハンドラを設定するか、一般的なConnectエラーハンドラを使用します。例

app.error(function(err, req, res, next) {
    console.error(err);
    res.send('Fail Whale, yo.');
});

この4つの原則は、Node.js+Express.jsアプリケーションにおけるすべてのエラー処理/レポーティングの基礎となるものでしょうか?

どのように解決するのか?

Node.jsのエラー処理は、一般的にA)の形式です。ほとんどのコールバックは、第1引数としてエラーオブジェクトを返すか、あるいは null .

Express.jsはミドルウェアを使用しており、ミドルウェアの構文はB)とE)(後述)を使用します。

C)は私に言わせればバッドプラクティスです。

app.get('/home', function(req, res) {
    // An error occurs
    throw err;
});

上記のように簡単に書き換えることができます。

app.get('/home', function(req, res, next) {
    // An error occurs
    next(err);
});

ミドルウェアの構文が有効なのは get リクエストに対応します。

D)に関しては

(07:26:37) tjholowaychuk: 3.xではapp.errorは削除されました。

TJが確認したところ app.error は非推奨で、E を使用します。

E)

app.use(function(err, req, res, next) {
  // Only handle `next(err)` calls
});

長さが4(引数が4つ)のミドルウェアは、エラーミドルウェアとみなされます。を呼び出すと next(err) connectが行って、エラー系ミドルウェアを呼び出す。