影響を受ける各レイヤーから1つずつ、同じエラーイベントのログエントリを大量に取得せずに、Node.jsアプリケーションでエラーを処理する方法を探しています。
これは実際にはどの言語にも当てはまるかもしれませんが、それを正しく行う方法はまだわかりません。質問は常にwhoがエラーを処理します。絶えず上に向かって投げるのは理にかなっていますか、そして誰が何をログに記録しますか?
データベースからユーザーを取得し、資格情報が一致する場合に「ログイン」できるユーザーシステムの簡単な例を見てみましょう。
データベースレイヤー
_// connects to a mongo db
class UserDatabase(){
async getUser(filter){
// this can throw if connection is dead
let user = await this.collections.users.findOne(filter);
return user;
}
}
_
アプリケーション層
_// makes calls to the db class to "login" a user
class UserApp {
async loginUser(email, password){
let user = await this.db.getUser({email});
if(!user){
return false;
}
if(user.password === options.password){
return true;
}
}
}
_
RESTレイヤー
_// calls the API from REST calls
class UserRestApi {
async loginUser(request, response){
let result = await this.app.loginUser(request.body.email, request.body.password);
if(result){
response.status = 200;
}
else {
response.status = 401;
}
response.end();
}
}
_
現在、エラー処理はありません。キャッチされない例外があれば、ほぼどこでも失敗する可能性があります。しかし、最低レベルでキャッチすることに意味があるのでしょうか? mongodb接続が停止したため、getUser()
が失敗したとします。私はそれをキャッチしてそこで記録することができますが、それから私はそれを何度も何度も何度も投げて、何度も何度も何度も記録しますか?それは理にかなっていますか?この場合、ログが2〜3回繰り返されることになります。
私はこれにどのように取り組むかわからないだけです。
例外は、エラーについて実際に何かを実行できるコードの層で処理する必要があります。
「ログと再スロー」パターンは アンチパターン と見なされることがよくあります(あなたが言及した理由のために、多くの重複したコードにつながり、実際に役立つことはありません)。
例外のポイントは、「予期されていない」ことです。エラーが発生したときに、作業中のコードのレイヤーが正常な処理を続行するために妥当なことを行えない場合は、それをバブルアップさせてください。
あなたが作業しているコードのレイヤーがcanエラーが発生したときに続行するために何かをする場合、エラーを処理するスポットです。 (そして、「失敗した」http応答コードを返すことは、「処理を続行する」方法としてカウントされます。プログラムがクラッシュしないように保存しています。)
Node.jsでhttpサーバーを構築する場合は、 Koa.js (非常に人気のある Express フレームワークの「後継者」)のようなフレームワークを使用することを強くお勧めします。
これらのフレームワークは、非常にクリーンでシンプルなツールセットを提供し、webapiを簡単に構築します。 (そして両方ともデフォルトでデフォルトのエラー処理を提供します)
標準的な方法は、例外をバブルアップさせ、ウェブサーバーがエラーメッセージを含む500に変換することです。
このエラーは、ローカル以外の接続からエラーメッセージを隠すことで改善できます。
すべての未処理のエラーをログに記録する未処理の例外ハンドラーを用意することで、これを改善できます。
今、あなたがノードでそれを行うことができるかどうかはわかりません。
.. Ok読んでいるだけで、.. ??!?
https://stackoverflow.com/questions/7310521/node-js-best-practice-exception-handling
だから答えはクレイジーで複雑で欠陥のあるエラーイベントのものに従うか、賢明な言語/ウェブサーバーにアップグレードすることです