如何在node.js中捕获http客户端请求异常

mat*_*nus 38 exception-handling node.js express

我有一个node.js应用程序,我想用来检查特定站点是否已启动并返回正确的响应代码.我希望能够捕获由于域名未解析或请求超时而出现的任何错误.问题是这些错误导致Node丢失.我是这个完整的异步编程方法的新手,所以我不确定在哪里放置我的try/catch语句.

我有一个类似/ 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;
  }
Run Code Online (Sandbox Code Playgroud)

即使每个行都包含在try/catch中,我仍然会得到像EHOSTUNREACH这样的未捕获的异常等等.我希望能够捕获那些并将其返回到ajax调用.

有关下一步尝试的建议吗?

rob*_*tjd 61

http.createClient 已被弃用.

以下是如何使用new处理错误的快速示例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();
Run Code Online (Sandbox Code Playgroud)


小智 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");
Run Code Online (Sandbox Code Playgroud)

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


Ivo*_*zel 9

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

你所能做的就是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');
Run Code Online (Sandbox Code Playgroud)

在这种情况下(通知端口800)记录:

{ message: 'ECONNREFUSED, Connection refused',
  stack: [Getter/Setter],
  errno: 111,
  syscall: 'connect' }
Run Code Online (Sandbox Code Playgroud)

Node.js仍处于重大发展阶段,未来几个月肯定会有很多进展,现在焦点似乎是修复3.x的性能缺陷并使API有些稳定,因为毕竟Node. js主要是服务器,因此吞吐量很重要.

你可以提交一个bug,但是要注意崩溃等优先级高于功能,大多数新功能都可以通过fork pull请求.

同样对于Node.js的当前路线图,请观看Ryan Dahl(Node的创作者)的演讲:http:
//developer.yahoo.com/yui/theater/video.php?v = yuiconf2010-dahl