2011-12-05 35 views
16

我想在node.js中使用HTTP客戶端時遇到ECONNREFUSED錯誤。我正在做的這樣請求:使用http.request在node.js中捕獲ECONNREFUSED?

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

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

我無法弄清楚如何抓住這個錯誤:

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

如果我做request.on('error', function() {});,不抓住它。如果我這樣做:

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

然後我得到TypeError: Object false has no method 'on'

我真的必須做一個頂級未捕獲的錯誤的東西來處理這個?此刻,無論我做什麼,我的整個過程都會退出。

編輯:我發現瞭如何通過創建connection對象做一些博客文章,呼籲對request,然後connection對象綁定到錯誤,但不會使整個http.request()快捷沒用?

+2

我想通了。這是因爲我這樣做: var req = http。request(options).on('response',function(res){do do stuff })。end(); req.on('error',handleError); 我在調用end()之後調用了req.on。捂臉! – 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. 關閉
  2. 引導到Windows,但不運行的交鑰匙應用
  3. 運行交鑰匙應用

我的客戶端發送一個'找到交鑰匙產品'GET消息給我的nodejs/express服務,然後嘗試通過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(); 
}