web-dev-qa-db-ja.com

各レイヤーでのNode.jsエラー処理

影響を受ける各レイヤーから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回繰り返されることになります。

私はこれにどのように取り組むかわからないだけです。

1
spin_round_22

エラー処理の一般原則

例外は、エラーについて実際に何かを実行できるコードの層で処理する必要があります。

「ログと再スロー」パターンは アンチパターン と見なされることがよくあります(あなたが言及した理由のために、多くの重複したコードにつながり、実際に役立つことはありません)。

例外のポイントは、「予期されていない」ことです。エラーが発生したときに、作業中のコードのレイヤーが正常な処理を続行するために妥当なことを行えない場合は、それをバブルアップさせてください。

あなたが作業しているコードのレイヤーがcanエラーが発生したときに続行するために何かをする場合、エラーを処理するスポットです。 (そして、「失敗した」http応答コードを返すことは、「処理を続行する」方法としてカウントされます。プログラムがクラッシュしないように保存しています。)

Node.js Webサーバーのエラー処理(Koa/Expressなどのライブラリを使用)

Node.jsでhttpサーバーを構築する場合は、 Koa.js (非常に人気のある Express フレームワークの「後継者」)のようなフレームワークを使用することを強くお勧めします。

これらのフレームワークは、非常にクリーンでシンプルなツールセットを提供し、webapiを簡単に構築します。 (そして両方ともデフォルトでデフォルトのエラー処理を提供します)

3
Caleb

標準的な方法は、例外をバブルアップさせ、ウェブサーバーがエラーメッセージを含む500に変換することです。

このエラーは、ローカル以外の接続からエラーメッセージを隠すことで改善できます。

すべての未処理のエラーをログに記録する未処理の例外ハンドラーを用意することで、これを改善できます。

今、あなたがノードでそれを行うことができるかどうかはわかりません。

.. Ok読んでいるだけで、.. ??!?

https://stackoverflow.com/questions/7310521/node-js-best-practice-exception-handling

だから答えはクレイジーで複雑で欠陥のあるエラーイベントのものに従うか、賢明な言語/ウェブサーバーにアップグレードすることです

1
Ewan