私は現在node.jsアプリに取り組んでおり、通常の非同期コードの問題が発生しています。
NodeのHTTPモジュールの上にサービスサーバーを実装しています。
このサーバーは(エクスプレスライク)ルートをサポートします。たとえば、次のようなコードがあります。
server.any("/someRoute",function(req,resp){
resp.end("this text is sent to clients via http")
});
サーバーは障害に耐えられる必要があります。渡された関数に問題が発生したときにサーバー全体をクラッシュさせたくありません。この問題は、次のようなコードを記述しているときに発生します。
server.any("/someRoute",function(req,resp){
setTimeout(function(){
throw new Error("This won't get caught");
},100);
});
ここでエラーをキャッチする方法がわかりません。1つのサーバー側の不具合でサーバーをクラッシュさせたくはありません。代わりに、500を提供したいと思います。
私が思いついた唯一の解決策は、実際には表現力がありません。process.on("uncaughtException",callback)
私はノード0.8を使用して同様のコードを使用することを思いついただけですDomains
(これは部分的な救済策ですが、ドメインは現在バグがあり、ハンドルごとにドメインを作成する必要があるため、これはまだあまり表現力がありません)。
私が達成したいのはthrow
、関数からスコープにアクションをバインドすることです。理想的な解決策は、関数からスローされたすべてのエラーを特定のハンドラー関数にバインドするようなものです。
これは可能ですか?この場合のエラーを処理するためのベストプラクティスは何ですか?
悪いリクエストの後もリクエストを処理し続けることができるはずだということを強調したいと思います。リクエストごとにサーバーを再起動するか、ハンドラーごとにドメインを作成して、キャッチされない例外をキャッチするのは悪い考えのようです。さらに-約束は私を助けることができるかもしれないと聞きました(約束の何かthrow
)、約束はこの状況で私を助けることができますか?