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

时间:2011-12-05 04:59:49

标签: node.js

我在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'

我真的必须做一个顶级未捕获错误的事情来处理这个问题吗?无论我做什么,我的整个过程都会退出。

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

4 个答案:

答案 0 :(得分:21)

您是否因为使用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();

答案 1 :(得分:4)

我已经为这个(以及许多其他)页面尝试了所有建议,我已经找到了解决方案。

我的客户需要检测运行嵌入式窗口的交钥匙产品。客户端从不同的机器提供给交钥匙。

交钥匙可以处于3种状态:

  1. 关闭
  2. 启动到Windows,但没有运行交钥匙应用程序
  3. 运行交钥匙应用
  4. 我的客户端向我的nodejs / express服务发送'查找交钥匙产品'GET消息,然后该服务尝试通过http.request查找交钥匙产品。 3个用例中每个用例的行为都是;

    1. 超时
    2. ECONNREFUSED - 因为交钥匙的Windows嵌入阶段是 拒绝连接。
    3. 对请求的正常回复(欢乐日场景)
    4. 以下代码处理所有3种情况。捕获ECONNREFUSED事件的技巧是了解其处理程序绑定到套接字事件。

      CL_INVALID_DEVICE

答案 2 :(得分:3)

http.request()的每次调用都会返回自己。 所以试试这样......

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

答案 3 :(得分:0)

对于不使用 DNS 的用户(您也可以使用 request 代替 get,只需将 get 替换为 request,如下所示:http.request({ ... })):< /p>

http.get({ 
    host: '127.0.0.1',
    port: 443,
    path: '/books?author=spongebob',
    auth: 'user:p@ssword#'
 }, resp => {
    let data;

    resp.on('data', chunk => {
        data += chunk;
    });

    resp.on('end', () => console.log(data));
}).on('error', err => console.log(err));