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)
当然,连接错误和对请求的响应都是异步到达的,这意味着简单地返回请求将不起作用.相反,您必须从事件处理程序中通知调用者结果.
不幸的是,目前没有办法直接捕获这些异常,因为所有的东西都是在后台异步发生的.
你所能做的就是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