43

我有一个 node.js 应用程序,我想用它来检查特定站点是否已启动并返回正确的响应代码。我希望能够捕获由于域名未解析或请求超时而出现的任何错误。问题是这些错误会导致 Node 崩溃。我是整个异步编程方法的新手,所以我不确定在哪里放置我的 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 调用。

关于下一步尝试什么的任何建议?

4

4 回答 4

74

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();
于 2011-12-16T22:45:18.127 回答
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");

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

于 2010-12-03T00:02:39.383 回答
10

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

您所能做的就是自己捕捉uncaughtException's:

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。 Node.js 主要是一个服务器,所以吞吐量很重要。

虽然您可以提交错误,但要注意崩溃等比功能具有更高的优先级,并且大多数新功能都是通过 fork pull 请求实现的。

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

于 2010-12-01T20:21:51.327 回答
0

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

function checkSite(url){
var http = require('http');
var request = http.get(url,r=>{console.log("OK",r)}).on("error",e=>{
    console.log("ERROR",e)
})
}
于 2020-03-07T10:07:56.073 回答