ホームページ >ウェブフロントエンド >フロントエンドQ&A >Nodejsの安定性を向上させる方法
#このチュートリアルの動作環境: Windows7 システム、nodejs バージョン 12.19.0、DELL G3 コンピューター。nodejs の安定性を向上させる方法: 1. 適切なコード構造を維持する; 2. "try~catch" を使用して例外をキャッチする; 3. ドメイン モジュールを使用してプログラム例外を処理する; 4. log4js を使用するログを記録するモジュール; 5.nodejsを管理するにはforeverモジュールを使用します。
nodejs プログラムの安定性と堅牢性の向上
インターネット上の投稿をいくつか見て、nodejs プログラムの安定性について不満を言いました。なぜ?まず、おそらくこれは JavaScript と関係があると思われます。Node は JavaScript で実装されており、JavaScript は「世界で最も誤解されている言語」としても知られています。nodejs の創設者の発言を見てみましょう。この記事では、node はなぜ JavaScript を使用して実装するのでしょうか? 次に、nodejs は結局のところまだ若いものであり、公式 Web サイトにはいくつかのモジュールでこのモジュールの現在のステータスも記載されています。 過去 2 日間、この問題について考えるのに少し時間がかかりました。プログラムの最初の関数は独立しているべきだと思います。1 つの関数が異常であっても、他の正常な関数に影響を与えるべきではありません。プログラム全体をクラッシュさせます。次に、プログラムがクラッシュした場合でも、プログラムが自動的に起動するようにする必要があります。さらに、問題を追跡しやすくするためにログを記録する必要があります。私は、nodejs の安定性は主に次の側面から改善できると考えています:1) 適切なコード構造を維持する:
node がシングルスレッドであることはわかっています。ノンブロッキング io、デフォルト 非同期であり、後続のプロセスはコールバックによって処理されます。ネストされたレベルが多すぎると、必然的にコードの論理構造に混乱が生じ、メンテナンスやアップグレードに役立ちません。非同期プロセス制御モジュールである async を使用して、コード ロジックを明確にすることができます。2) process.on('uncaughtException', function(err){...}); を使用して、捕捉されなかったエラーを処理します。
3) try~catch を使用して例外をキャッチします:
これは問題の一部のみを解決でき、すべてを解決できるわけではありません。シングル スレッド、ノンブロッキング IO、デフォルトで非同期、コールバックを通じて後続のプロセスを処理します。try~catch はコールバックのエラーをキャプチャできません。コールバックのエラーをキャプチャするにはどうすればよいですか? ドメイン モジュールを使用できます。
4) プログラム例外を処理するためにドメイン モジュールを使用する
まずドメインの説明を見てみましょう。ドメインは EventEmitter クラスのサブクラスです。エラー イベントをリッスンして、キャプチャしたエラーを処理します。これは、複数の異なる IO 操作を 1 つのグループとして処理する方法を提供します。ドメインに登録されているイベント トリガーまたはコールバックが「エラー」イベントをトリガーするか、エラーをスローする場合、ドメイン オブジェクトに通知されます。このエラーのコンテキストは `process.on('uncaughtException')' ハンドラーから直接失われるのではなく、エラー コードを伴うこのエラーのためにプログラムがすぐに終了することはありません。 ドメイン モジュールの使用方法は?例を見てください:serverDomain.run(function() { // 服务器在serverDomain的作用域内被创建 http.createServer(function(req, res) { // req和res同样在serverDomain的作用域内被创建 // 但是,我们想对于每一个请求使用一个不一样的域。 // 所以我们首先创建一个域,然后将req和res添加到这个域上。 var reqd = domain.create(); reqd.add(req); reqd.add(res); reqd.on('error', function(er) { console.error('Error', er, req.url); try { res.writeHead(500); res.end('Error occurred, sorry.'); } catch (er) { console.error('Error sending 500', er, req.url); } }); }).listen(1337); }); ```説明: 最初にドメインを作成し (domain.create())、次に監視する必要があるディストリビュータをドメインに追加し、最後にエラー イベントをドメインにバインドします。監視できること。 別の例を見てください:
var d = domain.create(); d.on('error', function(er) { console.error('Caught error!', er); }); d.run(function() { process.nextTick(function() { setTimeout(function() { // 模拟几个不同的异步的东西 fs.open('non-existent file', 'r', function(er, fd) { if (er) throw er; // 继续。。。 }); }, 100); }); });手順: まずドメインを作成し、エラー イベントをドメインにバインドして、ドメインのコンテキストで実行できる関数を提供します
If コールバックについてはどうですか?このように使用できます
var d = domain.create(); function readSomeFile(filename, cb) { fs.readFile(filename, 'utf8', d.bind(function(er, data) { // if this throws, it will also be passed to the domain return cb(er, data ? JSON.parse(data) : null); })); } d.on('error', function(er) { // an error occurred somewhere. // if we throw it now, it will crash the program // with the normal line number and stack message. });もちろん、次のように使用することもできます
var d = domain.create(); function readSomeFile(filename, cb) { fs.readFile(filename, 'utf8', d.bind(function(er, data) { // if this throws, it will also be passed to the domain return cb(er, data ? JSON.parse(data) : null); })); } d.on('error', function(er) { // an error occurred somewhere. // if we throw it now, it will crash the program // with the normal line number and stack message. });この関数は、domain.bind(callback) とほぼ同じです。ただし、スローされたエラーを捕捉するだけでなく、この関数に最初の引数として渡された Error オブジェクトもインターセプトします。
5) log4js モジュールを使用してログを記録する
Log4js は非常に強力なログ管理ツールです。この github プロジェクトをチェックアウトできます: https://github. com /nomiddlename/log4js-node6) Forever モジュールを使用して nodejs を管理します
Forever は、コマンド ライン ツールである nodejs をサーバー側で管理するためのモジュールです。アプリを停止します。 Forever は完全にコマンド ライン操作に基づいており、forever プロセスの管理下でノードのサブプロセスが作成され、ノードのサブプロセスの実行状態がモニターを通じて監視されます。プロセスがハングすると、永久にノード サーバーが自動的に再起動され、アプリケーションが正常であることを確認します。非常に使いやすいです。このプロジェクトに注目してください: https://github.com/nodejitsu/foreverしかし、永遠は万能薬ではなく、次のような問題もあります。問題:
nodejs チュートリアルをご覧ください。 !
以上がNodejsの安定性を向上させる方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。