2011-12-05 4 views
16

node.jsでHTTPクライアントを使用しているときにECONNREFUSEDエラーを検出しようとしています。node.jsのECONNREFUSEDをhttp.requestでキャッチしていますか?

Error: connect ECONNREFUSED 
    at errnoException (net.js:614:11) 
    at Object.afterConnect [as oncomplete] (net.js:605:18) 

私はrequest.on('error', function() {});をすれば、それはそれをキャッチしません:私はこのエラーをキャッチする方法を見つけ出すことはできません

var http = require('http'); 
var options = { host: 'localhost', port: '3301', path: '/', method: 'GET' }; 

http.request(options).on('response', function (res) { 
    // do some stuff 
}); 

を:私はこのような要求を作ってるんです。私がこれを好きなら、

var req = request.on(etc) 
req.on('error', function blah() {}); 

私はTypeError: Object false has no method 'on'を得ます。

これに対処するには、本当にトップレベルのキャッチされていないエラーを行う必要がありますか?現時点で私が何をしても私の全過程は終わりません。

編集:私はその上requestを呼び出し、connectionオブジェクトを作成することによって、それを行う方法についていくつかのブログの記事を見つけ、その後、connectionオブジェクトのエラーへの結合が、それは全体http.request()ショートカットが無駄になりませんか?

+2

私はこれを理解しました。私がこれをしていたからです: var req = http。リクエスト(オプション).on( 'response'、function(res){ // do do some stuff })end(); req.on( 'error'、handleError); 私はend()を呼び出した後、req.onを呼び出していました。 Facepalm! – Cera

+0

今後の見通しについては、そのブログ記事へのリンクを投稿することができますか?私はそれがここにあることが非常に役に立つと思う。 – CSilivestru

答えて

17

http://nodejs.org/docs/v0.6.5/api/http.html#http.requestをベースにしていない理由は何ですか?これを試してみてください:

var req = http.request(options, function(res) { 
    // Bind 'data', 'end' events here 
}); 

req.on('error', function(error) { 
    // Error handling here 
}); 

req.end(); 
+0

それは動作しません

var req = http.request("http://www.google.com/index.html", function(res) { console.log("Got response: " + res.statusCode); // Bind 'data', 'end' events here }); req.on('error', function(error) { console.log(error) // Error handling here }); req.end();
Codefor

+0

最初のパラメータとしてURLを渡す代わりに、有効なオプションオブジェクトを試しましたか? –

+1

ノード10を使用すると、この解決策がECONNREFUSEエラーを処理することを確認できます。 – Nucleon

2

http.request()を呼び出すごとに、それが返されます。 だから

http.request(options.function(){}).on('error',function(){}).end(); 
+0

簡単な解決策!ありがとう! –

2

私は、このためのソリューションを持って、この(および他の多くの)ページ上のすべての提案を試してみました...このようにそれを試してみてください。

私のクライアントは、埋め込みウィンドウを実行するターンキー製品を検出する必要があります。クライアントは別のマシンからターンキーに提供されます。

ターンキーは3つの状態にすることができ:

  1. は、Windowsが起動オフになって、しかし

私のクライアントが送信するターンキー・アプリケーションを実行しているターンキーアプリ

  • を実行していません私のnodejs/expressサービスに 'turnkey product'のGETメッセージを見つけ、http://requestでターンキー製品を探します。 3つのユースケースのそれぞれの動作は次のとおりです。

    1. タイムアウト
    2. ECONNREFUSED - ターンキーの窓埋め込ま相は 拒否接続ですので。
    3. 要求(幸せな一日のシナリオ)

    に対する正常な応答以下のコードは、すべての3つのシナリオを扱います。 ECONNREFUSEDイベントをキャッチするトリックは、そのハンドラがソケットイベントにバインドすることを学習していました。

    var http = require('http'); 
    var express = require('express'); 
    var url = require('url'); 
    
    
    function find (req, res) { 
        var queryObj = url.parse(req.url, true).query; 
    
        var options = { 
         host: queryObj.ip, // client attaches ip address of turnkey to url. 
         port: 1234, 
         path: '/some/path', 
        }; // http get options 
    
        var badNews = function (e) { 
         console.log (e.name + ' error: ', e.message); 
         res.send({'ok': false, 'msg': e.message}); 
        }; // sends failure messages to log and client 
    
        // instantiate http request object and fire it 
        var msg = http.request(options, function (response) { 
         var body = ''; 
    
         response.on ('data', function(d) { 
          body += d; 
         }); // accumulate response chunks 
    
         response.on ('end', function() { 
          res.send({'ok': true, 'msg': body}); 
          console.log('sent ok'); 
         }); // done receiving, send reply to client 
    
         response.on('error', function (e) { 
          badNews(e); 
         }); // uh oh, send bad news to client 
        }); 
    
        msg.on('socket', function(socket) { 
         socket.setTimeout(2000, function() { // set short timeout so discovery fails fast 
          var e = new Error ('Timeout connecting to ' + queryObj.ip)); 
          e.name = 'Timeout'; 
          badNews(e); 
          msg.abort(); // kill socket 
         }); 
         socket.on('error', function (err) { // this catches ECONNREFUSED events 
          badNews(err); 
          msg.abort(); // kill socket 
         }); 
        }); // handle connection events and errors 
    
        msg.on('error', function (e) { // happens when we abort 
         console.log(e); 
        }); 
    
        msg.end(); 
    } 
    
  • 関連する問題