如何捕捉node.js中的http客户端请求exception

我有一个node.js应用程序,我想用来检查一个特定的网站是否启动并返回正确的响应代码。 我希望能够捕捉出现的任何错误,因为域名不解决或请求超时。 问题在于这些错误会导致Node出错。 我是新来的整个asynchronous编程方法,所以我不知道在哪里把我的try / catch语句。

我有一个类似/ check / site1的ajax调用。 服务器端调用一个试图build立连接的函数,然后返回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等未捕获的exception。 我希望能够抓住那些并将其返回给ajax调用。

任何关于下一步尝试的build议?

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

当我研究类似的问题时,我偶然发现了另一个解决scheme。 如果因任何原因无法build立连接,http.Client将发出“错误”事件。 如果你处理这个事件,那么这个exception不会被抛出:

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

当然,连接错误和对请求的响应都是asynchronous到达的,这意味着简单地返回请求将不起作用。 相反,你必须在事件处理程序中通知调用者结果。

不幸的是,目前没有办法直接捕获这些exception,因为所有的东西都是在后台asynchronous发生的。

你所能做的就是自己去捕捉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)logging:

 { message: 'ECONNREFUSED, Connection refused', stack: [Getter/Setter], errno: 111, syscall: 'connect' } 

Node.js仍然在大量开发之中,在接下来的几个月里肯定会有很多进展,现在关注的焦点似乎是解决3.x的性能问题,并使API有点稳定,因为毕竟Node。 js主要是服务器,所以吞吐量很重要。

你可以提交一个bug ,但是要警告崩溃等比特性有更高的优先级,而且大多数新特性都会通过fork pull请求来实现。

另外对于Node.js的当前路线图,Ryan Dahl(Node的创build者)观看了这个演讲:
http://developer.yahoo.com/yui/theater/video.php?v=yuiconf2010-dahl