Expressでエラーを適切に処理するにはどうすればいいですか? 質問する

Expressでエラーを適切に処理するにはどうすればいいですか? 質問する

Express JS を使い始めたのですが、問題が発生しました。エラーを適切に処理する方法がわかりません。

たとえば、「イベント」というオブジェクトを提供する Web サービス API があるとします。ユーザーが見つからないイベント ID を送信したときに、「イベントが見つかりません」という単純な文字列を返したいと思います。現在、コードは次の方法で構成しています。

app.get('/event/:id', function(req, res, next) {
    if (req.params.id != 1) {
        next(new Error('cannot find event ' + req.params.id));
    }

    req.send('event found!');
});

私が提出するときid1 以外の場合、Node は次の出力でクラッシュします。

http.js:527
   throw new Error("Can't set headers after they are sent.");
         ^
Error: Can't set headers after they are sent.
    at ServerResponse.<anonymous> (http.js:527:11)
    at ServerResponse.setHeader (/usr/local/kayak/node_modules/express/node_modules/connect/lib/patch.js:62:20)
    at /usr/local/kayak/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js:72:19
    at [object Object].<anonymous> (fs.js:107:5)
    at [object Object].emit (events.js:61:17)
    at afterRead (fs.js:878:12)
    at wrapper (fs.js:245:17)

node.jsを使って私が知る限りではデバッガnext()、が呼び出された後もコード ブロックの実行が継続され、つまりreq.send('event found!')が実行されようとします。これは起こってほしくありません。

私が見つけた唯一の回避策は、単にnew Error()「next-ing」するのではなく、をスローすることですが、これにより、デフォルトの Express HTML エラー ページが生成されます。それよりももう少し制御したいです。

私は時間をかけてエラー処理セクションExpress のドキュメントを読みましたが、理解できませんでした。

ベストアンサー1

ぜひチェックしてみてくださいエクスプレスエラー処理。 そこから:

app.param('userId', function(req, res, next, id) {
    User.get(id, function(err, user) {
        if (err) return next(err);
        if (!user) return next(new Error('failed to find user'));
        req.user = user;
        next();
    });
});

あなたが見逃しているスイートスポットはreturn next(...)

おすすめ記事