2012-02-10 17 views
12

私はプロジェクトのパートナーと一緒に作業しています。彼はNode.js + Expressに多くのコードを書いてきましたが、私たちはアーキテクチャに関する問題に取り組んできました。Expressを使用してNode.jsでエラーを処理する方法

私の主な役割は、Node.js + Expressアプリケーションを設計する最良の方法を理解することでした。私はエラーを扱う2つのシナリオを実行しました。私はいくつかの提案をしたいと思います。

まず、トップレベルの例外をキャプチャするにはどうすればよいですか?私が最後に望むのは、バグがノードプロセスを完全に殺すことです。エラーが発生してもユーザーにサービスを提供したいと考えています。

第2に、いくつかのエラーはコールバック(私たちはを使用しています)経由で返されます。各ルートハンドラの一部として、ビュー(GET)をレンダリングするか、別のルート(POST)にリダイレクトするか、独自のエラーメッセージでエラー画面にリダイレクトします。どのように私はこのロジックをキャプチャすることができます1つの場所で

+0

ドメインで行うことができます。この回答を確認してください:[Expressエラー処理またはドメイン? - 解答] [1] [1]:http://stackoverflow.com/a/27382031/923642 – JakubKnejzlik

答えて

13

最初に、トップレベルの例外をキャプチャするにはどうすればよいですか?私が最後に望むのは、バグがノードプロセスを完全に殺すことです。エラーが発生してもユーザーにサービスを提供したいと考えています。

編集:は、私は一般的には、ノードの哲学は、任意のキャッチされない例外がプロセスを殺す必要があること、そしてあなたが適切なロギング機能とプロセスモニタのいくつかの種類の下にノードのアプリケーションを実行する必要があることだと思います。次のアドバイスは、エクスプレスルートハンドラーなどで発生する可能性があるその他のエラーに関するアドバイスです。

Expressには、すべてのスローされたエラーと、ルート/ミドルウェアのnextに渡されたすべてのエラーをキャプチャする一般的なerrorHandlerがあります。 500 Internal Server Errorで応答します。

第2に、いくつかのエラーはコールバック(caolan/asyncを使用しています)によって戻されます。各ルートハンドラの一部として、ビュー(GET)をレンダリングするか、別のルート(POST)にリダイレクトするか、独自のエラーメッセージでエラー画面にリダイレクトします。このロジックを1か所に確実に取り込めるようにするにはどうすればよいですか?

あなたがそうのように、各コールバックで呼び出すカスタムhandleErrorを作成することができます。

async.series(..., function(err, results) { 
    if(err) 
    return handleError(req, res, err); 
    // ... 
}); 

それともあなただけnext(err)でのエラーを渡すと、ここで説明するように、カスタムエラーハンドラを実装できます。http://expressjs.com/guide/error-handling.html

+2

エクスプレスのErrorHandlerは、ルートハンドラ/ミドルウェアの外で起こるエラーをキャッチしません。ですから、 'app.use()'や 'app.get | post | put(delete) 'ハンドラの外でエラーが発生した場合は、express/connect errorHandlerに頼ってキャッチすることはできません。 – timkg

4

トップレベルの例外:

あなたはuncaughtException event from processを使用することができますが、それは一般的にお勧めしません。

多くの場合、アプリケーションは破損状態になります(たとえば、通常は設定されている状態がありますが、例外は発生しません)。例外がスローされます。それから、それ以降、そこからのエラーが増えます。

クラッシュすると自動的にアプリを再起動するには、foreverのようなものを使用することをお勧めします。こうすることで、クラッシュした後でもアプリケーションを正常な状態にすることができます。急行の取り扱い

エラー:

あなたは新しいエラーインスタンスを作成し、チェーン内の次のコールバックにそれを渡すことができます。

例:

ここ以降のエラーを処理するには、エラーハンドラを設定します。 express docs on error handling

3

アウト優れたログ処理モジュールウィンストン:https://github.com/flatiron/winston

それはあなたが設定することができます例外処理はログだけでなく、プロセスを続行できるようにします。また、これらは明らかに深刻な問題であるため、特定のイベントタイプ(例外など)で電子メールを送信するようにWinstonを設定することもできます。

関連する問題