node.jsでHTTPクライアント要求の例外をキャッチする方法
-
29-09-2019 - |
質問
特定のサイトがアップしているかどうかを確認して適切な応答コードを返すnode.jsアプリを持っています。ドメイン名が解決されていないか、リクエストがタイミングを出しているため、出てくるエラーをキャッチできるようになりたいです。問題は、これらのエラーがノードをクラップアウトすることです。私はこの非同期プログラミングの方法論を初めて使用していないので、トライ/キャッチステートメントをどこに置くかわかりません。
/check /site1のようなAjaxコールがあります。接続を作成して、ステータスコードを返す関数を呼び出すサーバー側。これは非常に単純な機能であり、各ラインをトライ/キャッチで包みましたが、何もキャッチしません。ここにあります:
function checkSite(url){
var site = http.createClient(80, url);
var request = site.request('GET', '/', {'host': url});
request.end();
return request;
}
それらの各ラインがトライ/キャッチに包まれていても、私はまだehostunreachなどのような猛攻撃の例外を取得します。私はそれらを捕まえて、それをAjaxコールに戻すことができるようにしたいです。
次に何を試すべきかについての推奨事項はありますか?
解決
http.createClient
非推奨されています。
これは、新しいものを使用してエラーを処理する方法の簡単な例です http.request
:
var http = require("http");
var options = {
host : "www.example.com"
};
var request = http.request(options, function(req) {
...
});
request.on('error', function(err) {
// Handle error
});
request.end();
他のヒント
同様の問題を調査している間、私は別の解決策に出くわしました。 HTTP.CLIENTは、何らかの理由で接続を確立できない場合、「エラー」イベントを放出します。このイベントを処理した場合、例外はスローされません。
var http = require('http');
var sys = require('sys');
function checkSite(url) {
var site = http.createClient(80, url);
site.on('error', function(err) {
sys.debug('unable to connect to ' + url);
});
var request = site.request('GET', '/', {'host': url});
request.end();
request.on('response', function(res) {
sys.debug('status code: ' + res.statusCode);
});
}
checkSite("www.google.com");
checkSite("foo.bar.blrfl.org");
もちろん、接続エラーとリクエストへの応答は両方とも非同期に到着します。つまり、単にリクエストを返すだけでは機能しません。代わりに、イベントハンドラー内の結果を発信者に通知する必要があります。
残念ながら、現時点では、これらの例外を直接キャッチする方法はありません。なぜなら、すべてのものは背景で非同期に起こるからです。
あなたができることは、キャッチすることだけです uncaughtException
自分で:
var http = require('http');
function checkSite(url){
var site = http.createClient(800, url);
var request = site.request('GET', '/', {'host': url});
request.end();
return request;
}
process.on('uncaughtException', function (err) {
console.log(err);
});
checkSite('http://127.0.0.1');
この場合(ポート800に注意)ログ:
{ message: 'ECONNREFUSED, Connection refused',
stack: [Getter/Setter],
errno: 111,
syscall: 'connect' }
Node.jsはまだ激しい開発中であり、今後数か月で多くの進歩があります。現在、3.xのパフォーマンスバグを修正し、APIをやや安定させることに焦点が当てられているようです。 JSは主にサーバーなので、スループットが重要です。
あなたはできる バグを提出します ただし、警告されるクラッシュなどは、機能よりもはるかに優先度が高く、ほとんどの新機能はフォークプルリクエストを介してそれを実現しています。
また、Node.jsの現在のロードマップについては、Ryan Dahl(Node's Creator)によるこの講演をご覧ください。
http://developer.yahoo.com/yui/theater/video.php?v=yuiconf2010-dahl