2010-12-01 221 views
31

我有一個node.js應用程序,我想用它來檢查特定的站點是否啓動並返回正確的響應代碼。由於域名未解決或請求超時,我希望能夠捕獲出現的任何錯誤。問題在於這些錯誤會導致Node出錯。我對這個完整的異步編程方法很陌生,所以我不確定把try/catch語句放在哪裏。如何在node.js中捕獲http客戶端請求異常

我有一個類似/ 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調用。

關於接下來要做什麼的建議?

回答

52

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(); 
8

不幸的是,目前沒有辦法直接捕獲這些異常,因爲所有的東西都是在後臺異步發生的。

所有你能做的就是捉對自己的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有所穩定,因爲畢竟Node.js的主要是服務器,因此吞吐量問題。

您可以雖然file a bug,但被警告崩潰等比功能的方式更高的優先級,大多數新功能通過fork引入請求讓進去。

還爲Node.js的當前路線圖看這次談話由Ryan達爾(節點的創建者):
http://developer.yahoo.com/yui/theater/video.php?v=yuiconf2010-dahl

+0

最翔實。回答。永遠。你推薦什麼 是我現在有它設置,但不是一個選擇,我會檢查多個網站和各自所需的響應。現在我將研究其他路由,直到添加更好的異常處理。 這真的是令人失望,這些類型的錯誤只是浮動到頂部。 – mattmcmanus 2010-12-01 20:28:14

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"); 

當然,連接錯誤,並請求的響應都到達異步的,這意味着簡單地返回該請求將無法正常工作。相反,你必須在事件處理程序中通知調用者結果。