Ловля 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()
ярлык бесполезен?
Ответы
Ответ 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();
}