43

特定のサイトが稼働しているかどうかを確認し、適切な応答コードを返すために使用するnode.jsアプリがあります。ドメイン名が解決されていないか、リクエストがタイムアウトしているときに発生するエラーをキャッチできるようにしたいと思います。問題は、これらのエラーが原因でノードがクラップアウトすることです。私はこの非同期プログラミング方法論全体に慣れていないので、try/catchステートメントをどこに置くべきかわかりません。

/ check/site1のようなものに行くajax呼び出しがあります。接続を試みてstatusCodeを返す関数を呼び出すサーバー側。これは非常に単純な関数であり、各行をtry / catchでラップしましたが、何もキャッチされません。ここにあります:

function checkSite(url){
    var site = http.createClient(80, url);
    var request = site.request('GET', '/', {'host': url});
    request.end();
    return request;
  }

これらの各行がtry/catchでラップされていても、EHOSTUNREACHなどのキャッチされない例外が発生します。それらをキャッチして、ajax呼び出しに戻すことができるようにしたいと思います。

次に何を試すべきかについての推奨事項はありますか?

4

4 に答える 4

74

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();
于 2011-12-16T22:45:18.127 に答える
11

同様の問題を調査しているときに、別の解決策に出くわしました。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");

もちろん、接続エラーと要求への応答は両方とも非同期で到着します。つまり、単に要求を返すだけでは機能しません。代わりに、イベントハンドラー内から結果を呼び出し元に通知する必要があります。

于 2010-12-03T00:02:39.383 に答える
10

残念ながら、現時点では、すべてのものがバックグラウンドで非同期に発生するため、これらの例外を直接キャッチする方法はありません。

あなたができることは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はまだ開発が進んでおり、今後2、3か月で多くの進歩が見込まれます。現在、3.xのパフォーマンスのバグを修正し、APIをある程度安定させることに重点が置かれているようです。 jsは主にサーバーであるため、スループットが重要です。

バグを報告することはできますが、クラッシュなどは機能よりもはるかに優先度が高く、ほとんどの新機能はフォークプルリクエストを介してバグを報告します。

また、Node.jsの現在のロードマップについては、Ryan Dahl(Node's Creator)によるこの講演をご覧ください:
http ://developer.yahoo.com/yui/theater/video.php?v = yuiconf2010-dahl

于 2010-12-01T20:21:51.327 に答える
0

実際、受け入れられた答えはさらに簡単です。

function checkSite(url){
var http = require('http');
var request = http.get(url,r=>{console.log("OK",r)}).on("error",e=>{
    console.log("ERROR",e)
})
}
于 2020-03-07T10:07:56.073 に答える