Как уловить исключения клиентского запроса в node.js
У меня есть приложение node.js, которое я хочу использовать, чтобы проверить, встал ли какой-либо конкретный сайт и вернул ли он правильный код ответа. Я хочу, чтобы улавливать любые ошибки, возникающие по мере того, как доменное имя не разрешается или запрос истекает. Проблема в том, что эти ошибки вызывают Node, чтобы избавиться. Я новичок в всей этой асинхронной методологии программирования, поэтому я не уверен, куда поставить свои инструкции try/catch.
У меня есть вызов ajax, который идет на что-то вроде /check/site 1. Сервер, вызывающий функцию, которая пытается выполнить соединение, а затем возвращает statusCode. Это очень простая функция, и я завернул каждую строку в try/catch, и она никогда ничего не ловит. Вот он:
function checkSite(url){
var site = http.createClient(80, url);
var request = site.request('GET', '/', {'host': url});
request.end();
return request;
}
Даже с каждой из этих строк, завернутых в try/catch, я все равно получаю нечеткие исключения, такие как EHOSTUNREACH и т.д. Я хочу иметь возможность поймать их и вернуть их на вызов ajax.
Любые рекомендации о том, что нужно делать дальше?
Ответы
Ответ 1
http.createClient
устарел.
Вот краткий пример обработки ошибок с помощью нового http.request
:
var http = require("http");
var options = {
host : "www.example.com"
};
var request = http.request(options, function(req) {
...
});
request.on('error', function(err) {
// Handle error
});
request.end();
Ответ 2
Я наткнулся на другое решение, пока я изучал аналогичную проблему. http.Client испускает событие "ошибка", если соединение по какой-либо причине невозможно установить. Если вы обрабатываете это событие, исключение не будет выбрано:
var http = require('http');
var sys = require('sys');
function checkSite(url) {
var site = http.createClient(80, url);
site.on('error', function(err) {
sys.debug('unable to connect to ' + url);
});
var request = site.request('GET', '/', {'host': url});
request.end();
request.on('response', function(res) {
sys.debug('status code: ' + res.statusCode);
});
}
checkSite("www.google.com");
checkSite("foo.bar.blrfl.org");
Конечно, ошибка соединения и ответ на запрос оба поступают асинхронно, а это означает, что просто возврат запроса не будет работать. Вместо этого вам нужно будет уведомить вызывающего абонента о результатах из обработчиков событий.
Ответ 3
К сожалению, на данный момент нет никакого способа поймать эти исключения напрямую, поскольку все вещи происходят асинхронно в фоновом режиме.
Все, что вы можете сделать, это поймать uncaughtException
самостоятельно:
var http = require('http');
function checkSite(url){
var site = http.createClient(800, url);
var request = site.request('GET', '/', {'host': url});
request.end();
return request;
}
process.on('uncaughtException', function (err) {
console.log(err);
});
checkSite('http://127.0.0.1');
Что в этом случае (извещение порт 800) регистрируется:
{ message: 'ECONNREFUSED, Connection refused',
stack: [Getter/Setter],
errno: 111,
syscall: 'connect' }
Node.js по-прежнему находится в тяжелом развитии, и в ближайшие пару месяцев будет очень много прогресса, сейчас основное внимание, похоже, связано с исправлением ошибок производительности для 3.x и делает API несколько стабильным, потому что в конце концов Node.js в основном является сервером, поэтому пропускная способность важна.
Вы можете записать ошибку, но предупредить о сбоях и т.д. имеют более высокий приоритет, чем функции, а большинство новых функций делают это через fork pull.
Также для текущей дорожной карты Node.js смотрите этот разговор Райана Даля (Node Творца):
http://developer.yahoo.com/yui/theater/video.php?v=yuiconf2010-dahl