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

Cer*_*era 18 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
});
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何捕获此错误:

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

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

var req = request.on(etc)
req.on('error', function blah () {});
Run Code Online (Sandbox Code Playgroud)

然后我明白了TypeError: Object false has no method 'on'.

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

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

Rya*_*lds 23

您之所以没有使用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();
Run Code Online (Sandbox Code Playgroud)

  • 使用节点10,我可以确认此解决方案确实可以处理ECONNREFUSE错误。 (3认同)

小智 6

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

http.request(options.function(){}).on('error',function(){}).end();
Run Code Online (Sandbox Code Playgroud)


Vor*_*ord 5

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

我的客户需要检测运行嵌入式Windows的交钥匙产品。客户端是从另一台机器到交钥匙服务的。

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

  1. 关掉
  2. 引导进入Windows,但未运行交钥匙应用
  3. 运行交钥匙应用

我的客户向我的nodejs / express服务发送了“查找交钥匙产品” GET消息,然后该服务尝试通过http.request查找交钥匙产品。这三个用例的行为分别是:

  1. 超时
  2. ECONNREFUSED-因为交钥匙的Windows嵌入式阶段正在拒绝连接。
  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();
}
Run Code Online (Sandbox Code Playgroud)