防弾Node.js

インド人の問題

Node.jsの最近の残りの欠点の1つは、バックエンドの開発者がNode.jsを使用するのを怖がらせていたが、スレッド内のキャッチされない例外がワーカーを台無しにし、彼からの応答を待っていたすべてのクライアントが何も受け取らなかったという事実でした。



tl; dr非同期try \ catch用の新しいAPIがあります。 この記事から、例をコピーして貼り付けて再生できます。



状況を考慮してください。

ノードのWebサーバーにリクエストがあり、データベースから受信したデータを処理する過程で、何らかの問題が発生します(検証できない不適切なパラメーター、データベースラックが落ちた、または単に不注意)-エラーが発生しました。 リクエストを開始する前に、他のクライアントから5つのリクエストがあり、ページの読み込みが開始されました。 リクエストの後、他のユーザーからさらに10件のリクエストが受信されました。 そして、ここで彼女は、並列クエリの1つの腸での間違いです。 16個のリクエストはすべて落ちます。 無実の人は苦しみます。



リクエストごとに個別のワーカーを作成することも可能ですが、これはリソースの点で非常に高価です。

try \ catchで危険な部分をラップできますが、複雑なシステムではこれは不可能です。

あなた自身の危険とリスクにおいて、すべてが真実であり、損失が小さいことを期待できます。



正規ではありません。



はい、ドメイン

そのため、バージョン0.8には、エラーをキャッチする達人、卓越したDomainという特効薬がありました。 現時点では、APIは不安定な状態ですが、すでに使用できます。



簡単な例:

var domain = require('domain'), server = require('http').createServer(function(req, res) { //   var d = domain.create(); //   ,   500     d.on('error', function(err) { console.error('error', err.stack); res.statusCode = 500; res.setHeader('content-type', 'text/plain'); res.end('Houston, we have a problem!\n'); }); //   ,       d.add(req); d.add(res); //       d.run(function () { switch(req.url) { case '/error': setTimeout(function() { //   -     uncaught.error(); }); break; default: res.end('ok'); } }); }); server.listen(8080);
      
      







この単純なスクリプトを実行することで、ルートアドレスに切り替えるとすべてが正常になりますが、/エラーアドレスに移動すると、コンソールにエラーログが表示され、ブラウザーに何かがうまくいかず、ステータスが500であるという正しいメッセージが表示されます。



PSスペルと句読点について申し訳ありませんが、エラーを指摘させていただきます。



All Articles