私は Node でエラーを処理する適切な方法を研究しており、StackOverflow と NodeJS のサイトでいくつかの良い答えを見つけました。try-catch が機能せず、NodeJS ドキュメント自体: http://nodejs.org/api/domain.html。
ただし、try/catch および/またはドメインをいつ、どこで使用するかについて、いくつかの質問が残っています。これは非同期コードと同期コードの関係だと思いますが、ドメインに関する NodeJS のサイトで提供されているサンプル コード内でも、ドメインのエラー ハンドラ内で try/catch を使用しています。誰かがこれを詳細に説明できますか? try/catch はエラー ハンドラー内の非同期エラーをキャッチできませんか?
それを超えて、NodeJS のドキュメントは、例外が発生した場合でもプロセスを終了する必要があることを示唆しています。そのため、Domain ドキュメントのコードは、例外がキャッチされたときにクラスターを使用して新しい子プロセス/ワーカーをフォークすることを提案しています。与えられた主な理由は次のとおりです。
JavaScript で throw がどのように機能するかという性質上、参照を漏らしたり、他の種類の未定義の脆弱な状態を作成したりせずに、安全に「中断したところから再開する」方法はほとんどありません。
誰かがこれを説明できますか?javascriptでスローがどのように機能するかの性質は何ですか? リソースが狂ったようにリークするのはなぜですか? そして、プロセスを再起動したり、ワーカーを強制終了/開始したりすることは常に本当に必要ですか?
たとえば、私はJugglingDB ORM を実装していて、ある時点でローカルの mysql サーバーを起動するのを忘れていました。ECONNREFUSED
プロセスをクラッシュさせるエラーが発生しました。これが実稼働環境 (DB がクラッシュするか一時的に利用できない) で発生する可能性があることを認識し、このエラーをキャッチして適切に処理したいと考えました。接続を再試行し、DB に関する状態変数を維持し、場合によっては一時的に利用できないメッセージで応答して要求を処理します。Try/Catch は単にエラーをキャッチできませんでした。ドメインを使用できることがわかりましたが、推奨される戦略を使用すると、DB がオンラインに戻るまで、ワーカーを強制終了して開始するという無限ループに陥ります。
JugglingDBには、何らかの理由で「接続」イベントしかありませんが、エラー オブジェクトを渡すコールバック関数はありません。クラスをインスタンス化した瞬間に接続を試み、適切な方法でキャッチおよび発行されないエラーをスローします。これにより、他の ORM を検討したくなりましたが、そのような状況を処理する方法に関する私の質問にはまだ答えがありません。ドメインを使用して潜在的な接続エラーをキャッチし、新しいプロセスを開始せずに正常に処理するのは間違っているでしょうか?
JugglingDB githubに投稿した質問/問題は次のとおりです。プーリング オプションが有効な場合に発生します):
Error: connect ECONNREFUSED
at errnoException (net.js:901:11)
at Object.afterConnect [as oncomplete] (net.js:892:19)
--------------------
at Protocol._enqueue (/Users/aaronstorck/Sites/site/node_modules/jugglingdb-mysql/node_modules/mysql/lib/protocol/Protocol.js:110:48)
at Protocol.handshake (/Users/aaronstorck/Sites/site/node_modules/jugglingdb-mysql/node_modules/mysql/lib/protocol/Protocol.js:42:41)
at PoolConnection.Connection.connect (/Users/aaronstorck/Sites/site/node_modules/jugglingdb-mysql/node_modules/mysql/lib/Connection.js:101:18)
at Pool.getConnection (/Users/aaronstorck/Sites/site/node_modules/jugglingdb-mysql/node_modules/mysql/lib/Pool.js:42:23)
at Pool.query (/Users/aaronstorck/Sites/site/node_modules/jugglingdb-mysql/node_modules/mysql/lib/Pool.js:185:8)
at initDatabase (/Users/aaronstorck/Sites/site/node_modules/jugglingdb-mysql/lib/mysql.js:62:20)
at initializeConnection (/Users/aaronstorck/Sites/site/node_modules/jugglingdb-mysql/lib/mysql.js:49:9)
at Object.initializeSchema [as initialize] (/Users/aaronstorck/Sites/site/node_modules/jugglingdb-mysql/lib/mysql.js:33:5)
at new Schema (/Users/aaronstorck/Sites/site/node_modules/jugglingdb/lib/schema.js:105:13)
at Application.loadConnections (/Users/aaronstorck/Sites/site/core/application.js:95:40)
Process finished with exit code 8
私が理解するのを助けることができるこの部分について、事前に感謝します! :)