如何捕获Node.js中的HTTP客户端请求异常
-
29-09-2019 - |
题
我有一个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