回答:
http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexceptionでNode自身のドキュメントを読むことができるので、他の答えは本当に狂っています
誰かが他の明記された回答を使用している場合は、ノードドキュメントをお読みください。
uncaughtException
例外処理のための非常に大雑把なメカニズムであり、将来削除される可能性があることに注意してください
PM2
まず、のインストールPM2
を強くお勧めしNode.js
ます。PM2は、クラッシュの処理、Nodeアプリのモニタリング、負荷分散に非常に優れています。PM2は、ノードアプリがクラッシュしたり、何らかの理由で停止したり、サーバーが再起動したりしても、すぐにNodeアプリを起動します。したがって、コードを管理した後でアプリがクラッシュした場合でも、PM2はすぐに再起動できます。詳細については、PM2のインストールと実行
アプリ自体のクラッシュを防ぐためのソリューションに戻ります。
それで、最終的に、Node文書自体が示唆することを思いつきました。
を使用せず、代わりにwith を
uncaughtException
使用domains
してくださいcluster
。を使用する場合はuncaughtException
、未処理の例外が発生するたびにアプリケーションを再起動してください。
DOMAINとクラスタ
実際に行うことは、エラーをトリガーしたリクエストにエラー応答を送信する一方で、他のユーザーが通常の時間に完了できるようにし、そのワーカーでの新しいリクエストのリッスンを停止することです。
このように、ワーカーがエラーを検出するとマスタープロセスが新しいワーカーをフォークできるため、ドメインの使用はクラスターモジュールと密接に関連しています。以下のコードを参照して、私の意味を理解してください
を使用しDomain
、を使用してプログラムを複数のワーカープロセスに分離するCluster
ことで、より適切に対応し、はるかに安全にエラーを処理できます。
var cluster = require('cluster');
var PORT = +process.env.PORT || 1337;
if(cluster.isMaster)
{
cluster.fork();
cluster.fork();
cluster.on('disconnect', function(worker)
{
console.error('disconnect!');
cluster.fork();
});
}
else
{
var domain = require('domain');
var server = require('http').createServer(function(req, res)
{
var d = domain.create();
d.on('error', function(er)
{
//something unexpected occurred
console.error('error', er.stack);
try
{
//make sure we close down within 30 seconds
var killtimer = setTimeout(function()
{
process.exit(1);
}, 30000);
// But don't keep the process open just for that!
killtimer.unref();
//stop taking new requests.
server.close();
//Let the master know we're dead. This will trigger a
//'disconnect' in the cluster master, and then it will fork
//a new worker.
cluster.worker.disconnect();
//send an error to the request that triggered the problem
res.statusCode = 500;
res.setHeader('content-type', 'text/plain');
res.end('Oops, there was a problem!\n');
}
catch (er2)
{
//oh well, not much we can do at this point.
console.error('Error sending 500!', er2.stack);
}
});
//Because req and res were created before this domain existed,
//we need to explicitly add them.
d.add(req);
d.add(res);
//Now run the handler function in the domain.
d.run(function()
{
//You'd put your fancy application logic here.
handleRequest(req, res);
});
});
server.listen(PORT);
}
けれどもはDomain
廃止を保留しているとノードのドキュメントに記載されているように新しい交換が来るように削除されます
このモジュールは廃止予定です。代替APIが確定すると、このモジュールは完全に非推奨になります。ドメインが提供する機能を絶対に必要とするユーザーは、当面はそれに依存する可能性がありますが、将来的には別のソリューションに移行する必要があると予想する必要があります。
しかし、新しい置換が導入されない限り、クラスターを備えたドメインは、Node Documentationが示唆する唯一の優れたソリューションです。
深く理解しDomain
、Cluster
読むために
https://nodejs.org/api/domain.html#domain_domain(Stability: 0 - Deprecated
)
https://nodejs.org/api/cluster.html
クラスターとドメインに関するこのすばらしい詳細な説明を共有してくれた@Stanley Luoに感謝します。
restart your application after every unhandled exception!
2000ユーザーがビデオのストリーミングにノードWebサーバーを使用していて、1人のユーザーが例外を受け取った場合、再起動しても他のすべてのユーザーが中断されませんか?
uncaughtException
使用Domain
して使用するのはよくありCluster
ません。また、Nodeサーバーを再起動する必要もありません。一方、使用するuncaughtException
場合は、ユーザーが問題に直面するたびにサーバーを再起動する必要があります。したがって、クラスターでドメインを使用します。
domain
が完全に非推奨になり、削除された場合はどうすればよいですか?
このコードをrequireステートメントとグローバル宣言のすぐ下に配置します。
process.on('uncaughtException', function (err) {
console.error(err);
console.log("Node NOT Exiting...");
});
私のために働く。唯一気に入らないのは、物事をクラッシュさせただけの場合ほど情報が得られないことです。
forever
。
試す supervisor
npm install supervisor
supervisor app.js
または、forever
代わりにインストールできます。
これは、サーバーを再起動してクラッシュしたときにサーバーを回復するだけです。
forever
コード内で使用して、クラッシュしたプロセスを適切に回復できます。
forever
ドキュメントは、プログラムの取り扱い終了/エラーの固体情報を持っています。
try-catchを使用すると、キャッチされなかったエラーを解決できる場合がありますが、一部の複雑な状況では、非同期関数のキャッチなどの機能を正しく実行できません。Nodeでは、非同期関数呼び出しには、潜在的なアプリのクラッシュ操作が含まれる可能性があることに注意してください。
使用uncaughtException
は回避策ですが、非効率的であると認識されており、Nodeの将来のバージョンでは削除される可能性があるため、これを当てにしないでください。
理想的なソリューションは、ドメインを使用することです:http : //nodejs.org/api/domain.html
サーバーがクラッシュした場合でもアプリが稼働していることを確認するには、次の手順に従います。
ノードクラスターを使用して、コアごとに複数のプロセスをフォークします。したがって、1つのプロセスが停止すると、別のプロセスが自動的に起動します。チェックアウト:http : //nodejs.org/api/cluster.html
try-catchまたはuncaughtを使用する代わりに、ドメインを使用して非同期操作をキャッチします。try-catchまたはuncaughtが悪い考えだと言っているのではありません!
forever / supervisorを使用してサービスを監視する
ノードアプリを実行するデーモンを追加:http : //upstart.ubuntu.com
お役に立てれば!
pm2ノードモジュールを試してみてください。一貫性があり、ドキュメントが充実しています。ロードバランサーが組み込まれたNode.jsアプリのプロダクションプロセスマネージャー。この問題のuncaughtExceptionは避けてください。 https://github.com/Unitech/pm2
UncaughtExceptionは「非常に大まかなメカニズム」であり(真であるため)、ドメインは現在非推奨になっています。ただし、(論理)ドメインに関するエラーをキャッチするためのメカニズムがまだ必要です。図書館:
https://github.com/vacuumlabs/yacol
これを行うのに役立ちます。少しだけ追加の記述を行うことで、コード全体で優れたドメインセマンティクスを実現できます。