通常、Expressにはエラーが発生しない限り、ユーザーの警告なしにプロセスがクラッシュし、エラーをキャッチしてリクエストコンテキストを維持するのは容易ではないためさもないと。
Expressハンドラの選択肢は、エラー応答を直接返すか(例のように)、next(err)
を呼び出すことです。私のアプリでは、いつも一貫してさまざまな問題のケースを処理するためのエラー処理ミドルウェアをセットアップできるので、後者はいつもやっています。以下
例:
app.get('/something', (req, res, next) => {
// whatever database call or the like
Something.find({ name: 'something'}, (err, thing) => {
// some DB error, we don't know what.
if (err) return next(err);
// No error, but thing wasn't found
// In this case, I've defined a NotFoundError that extends Error and has a property called statusCode set to 404.
if (!thing) return next(new NotFoundError('Thing was not found'));
return res.json(thing);
});
});
そして、そのようなエラーを処理するためのいくつかのミドルウェア:Expressのほぼすべてが、ミドルウェアを介して行われ
app.use((err, req, res, next) => {
// log the error; normally I'd use debug.js or similar, but for simplicity just console in this example
console.error(err);
// Check to see if we have already defined the status code
if (err.statusCode){
// In production, you'd want to make sure that err.message is 'safe' for users to see, or else use a different value there
return res.status(err.statusCode).json({ message: err.message });
}
return res.status(500).json({ message: 'An error has occurred, please contact the system administrator if it continues.' });
});
注意。
いくつかのコードを表示できますか?次のこと(エラー)はどのような結果をもたらすでしょうか?私のAPIのほとんどはミドルウェアを持っていません。 –
エラーを処理するためにどのようなミドルウェアをお勧めしますか? –
私が示したものは?ノード内のミドルウェアは単なるハンドラ関数です。場合によっては、モジュールを使用してそれを行うこともできますが、そうする必要はありません。私が言及した上記のものを包む方法として、プラーター(https://www.npmjs.com/package/praeter)を書いたが、自分のコードで簡単にやり遂げることができる。 – Paul