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

Как уловить исключения клиентского запроса в 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.

Любые рекомендации о том, что нужно делать дальше?

4b9b3361

Ответ 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