用http.request在node.js中捕获ECONNREFUSED?

我在node.js中使用HTTP客户端时试图捕获ECONNREFUSED错误。 我正在提出这样的要求:

var http = require('http'); var options = { host: 'localhost', port: '3301', path: '/', method: 'GET' }; http.request(options).on('response', function (res) { // do some stuff }); 

我无法弄清楚如何捕捉这个错误:

 Error: connect ECONNREFUSED at errnoException (net.js:614:11) at Object.afterConnect [as oncomplete] (net.js:605:18) 

如果我做request.on('error', function () {}); ,它没有抓住它。 如果我这样做:

 var req = request.on(etc) req.on('error', function blah () {}); 

然后我得到TypeError: Object false has no method 'on'

我真的必须做一个顶级的未被捕获的错误的东西来处理这个? 此刻,无论我做什么,我的整个过程都退出了。

编辑:我发现了一些关于如何做到这一点的博客文章,通过创build一个connection对象,调用request ,然后绑定到connection对象上的错误,但不会使整个http.request()快捷方式无用?

任何你不使用http://nodejs.org/docs/v0.6.5/api/http.html#http.request作为你的基础的原因? 尝试这个:

 var req = http.request(options, function(res) { // Bind 'data', 'end' events here }); req.on('error', function(error) { // Error handling here }); req.end(); 

每次调用http.request()返回它自己。 所以试试像这样…

 http.request(options.function(){}).on('error',function(){}).end(); 

我已经有了一个解决scheme,尝试了这个(和其他许多)页面上的所有build议。

我的客户需要检测运行embedded式窗口的交钥匙产品。 客户端从不同的机器到交钥匙服务。

交钥匙可以有三种状态:

  1. 关掉
  2. 启动到Windows,但不运行交钥匙的应用程序
  3. 运行交钥匙的应用程序

我的客户端向我的nodejs / express服务发送一个“find交钥匙产品”GET消息,然后通过http.request尝试find交钥匙产品。 3个用例中的每一个的行为是;

  1. 时间到
  2. ECONNREFUSED – 因为交钥匙的窗口embedded阶段拒绝连接。
  3. 对请求的正常响应(快乐的一天场景)

下面的代码处理所有3种情况。 捕捉ECONNREFUSED事件的技巧是学习它的处理程序绑定到套接字事件。

 var http = require('http'); var express = require('express'); var url = require('url'); function find (req, res) { var queryObj = url.parse(req.url, true).query; var options = { host: queryObj.ip, // client attaches ip address of turnkey to url. port: 1234, path: '/some/path', }; // http get options var badNews = function (e) { console.log (e.name + ' error: ', e.message); res.send({'ok': false, 'msg': e.message}); }; // sends failure messages to log and client // instantiate http request object and fire it var msg = http.request(options, function (response) { var body = ''; response.on ('data', function(d) { body += d; }); // accumulate response chunks response.on ('end', function () { res.send({'ok': true, 'msg': body}); console.log('sent ok'); }); // done receiving, send reply to client response.on('error', function (e) { badNews(e); }); // uh oh, send bad news to client }); msg.on('socket', function(socket) { socket.setTimeout(2000, function () { // set short timeout so discovery fails fast var e = new Error ('Timeout connecting to ' + queryObj.ip)); e.name = 'Timeout'; badNews(e); msg.abort(); // kill socket }); socket.on('error', function (err) { // this catches ECONNREFUSED events badNews(err); msg.abort(); // kill socket }); }); // handle connection events and errors msg.on('error', function (e) { // happens when we abort console.log(e); }); msg.end(); }