Подтвердить что ты не робот

Ловля ECONNREFUSED в node.js с http.request?

Я пытаюсь поймать ошибки ECONNREFUSED при использовании HTTP-клиента в node.js. Я делаю такие запросы:

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() ярлык бесполезен?

4b9b3361

Ответ 1

По какой причине вы не используете 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();

Ответ 2

Каждый вызов http.request() возвращает его. Так что попробуйте вот так...

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

Ответ 3

У меня есть решение для этого, пробовав все предложения на этой (и многих других) страницах.

Мой клиент должен обнаружить продукт "под ключ" , который запускает встроенные окна. Клиент обслуживается с другой машины под ключ.

Под ключ могут находиться в трех состояниях:

  • выключен
  • загружается в окна, но не работает под ключ.
  • запуск приложения "под ключ"

Мой клиент отправляет сообщение "найти продукт" под ключ "GET в мою службу nodejs/express, которая затем пытается найти продукт" под ключ "через http.request. Поведение для каждого из трех вариантов использования:

  • Тайм-аут
  • ECONNREFUSED - потому что оконная фаза "под ключ" отказ от соединений.
  • нормальный ответ на запрос (сценарий "Счастливый день" )

В приведенном ниже коде описаны все 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();
}