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(...)