我有一个node.js应用程序,我想用来检查特定站点是否启动并返回正确的响应代码。我希望能够捕获任何错误,因为域名无法解决或请求正在计时。问题在于这些错误会导致节点废除。我是整个异步编程方法的新手,所以我不确定在哪里放置尝试/捕捉语句。

我有一个ajax调用,该调用是 /check /site1之类的。服务器端调用试图建立连接然后返回状态代码的函数。这是一个非常简单的功能,我在尝试/捕获中将每一行都包裹起来,并且永远不会抓住任何东西。这里是:

function checkSite(url){
    var site = http.createClient(80, url);
    var request = site.request('GET', '/', {'host': url});
    request.end();
    return request;
  }

即使将这些线包裹在尝试/捕获中,我仍然会得到像eHostunreach这样的未被发现的例外。我希望能够抓住这些并将其返回到Ajax呼叫。

关于接下来要做什么的建议?

有帮助吗?

解决方案

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

其他提示

在研究类似问题时,我偶然发现了另一个解决方案。 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");

当然,连接错误和对请求的响应都异步到达,这意味着仅返回请求就无法正常工作。相反,您必须将事件处理程序内部的结果通知呼叫者。

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

您所能做的就是抓住 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有些稳定,因为毕竟是节点。 JS主要是服务器,因此吞吐量很重要。

你可以 提交错误 不过,但是要警告崩溃等。优先级比功能更高,并且大多数新功能都使其成为Via Fork拉的请求。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top