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

Exception handling 如何在node.js中捕获http客户端请求异常,exception-handling,node.js,express,Exception Handling,Node.js,Express,我有一个node.js应用程序,我想用它来检查某个特定站点是否已启动并返回正确的响应代码。我希望能够捕捉到任何错误,因为域名无法解析或请求超时。问题是这些错误会导致节点失效。我不熟悉这种异步编程方法,所以我不确定把try/catch语句放在哪里 我有一个类似于/check/site1的ajax调用。调用函数的服务器端,该函数尝试建立连接,然后返回状态码。这是一个非常简单的函数,我用try/catch包装了每一行,但它从未捕获任何内容。这是: function checkSite(url){

我有一个node.js应用程序,我想用它来检查某个特定站点是否已启动并返回正确的响应代码。我希望能够捕捉到任何错误,因为域名无法解析或请求超时。问题是这些错误会导致节点失效。我不熟悉这种异步编程方法,所以我不确定把try/catch语句放在哪里

我有一个类似于/check/site1的ajax调用。调用函数的服务器端,该函数尝试建立连接,然后返回状态码。这是一个非常简单的函数,我用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调用


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

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

您所能做的就是自己捕获
未捕获的异常

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)记录的日志:

Node.js仍在大力开发中,未来几个月肯定会有很多进展,目前的重点似乎是修复3.x的性能缺陷,并使API保持一定的稳定性,因为毕竟Node.js主要是一台服务器,所以吞吐量很重要

虽然可以,但要注意的是,崩溃等功能的优先级远远高于其他功能,而且大多数新功能都是通过fork-pull请求实现的

另外,有关Node.js的当前路线图,请观看Ryan Dahl(Node的创建者)的演讲:

在研究类似问题时,我偶然发现了另一个解决方案。如果由于任何原因无法建立连接,客户端将发出“错误”事件。如果处理此事件,则不会引发异常:

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

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

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

事实上,更容易接受的答案是:

function checkSite(url){
var http = require('http');
var request = http.get(url,r=>{console.log("OK",r)}).on("error",e=>{
    console.log("ERROR",e)
})
}

信息量最大。回答。曾经您推荐的是我目前的安装方式,但不是一个选项,因为我将检查多个站点,并需要每个站点的响应。在添加更好的异常处理之前,我将研究其他路由。这真的是一个令人沮丧的问题,那些类型的错误只是浮到顶部。正如我在回答的第二部分所说,没有办法抓住它。如果您确实需要它,请分叉节点并添加它,然后执行请求拉取操作。你不会有任何运气在问题跟踪器上只会崩溃,这样会引起注意。我希望我能把它叉出来并添加那个功能,但我甚至不知道从哪里开始。我相信这个功能会在短期内实现,Joyent(托管解决方案)与Ryan Dahl达成了一项协议来赞助开发,核心团队很快就会有更多的人:)
function checkSite(url){
var http = require('http');
var request = http.get(url,r=>{console.log("OK",r)}).on("error",e=>{
    console.log("ERROR",e)
})
}