2010-12-01 220 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"); 

当然,连接错误,并请求的响应都到达异步的,这意味着简单地返回该请求将无法正常工作。相反,你必须在事件处理程序中通知调用者结果。