Как перехватить исключения http-запроса клиента в node.js - PullRequest
36 голосов
/ 01 декабря 2010

У меня есть приложение node.js, которое я хочу использовать, чтобы проверить, работает ли конкретный сайт и возвращает ли он правильный код ответа. Я хочу быть в состоянии отследить любые ошибки, которые возникают, поскольку доменное имя не разрешается или запрос истекает. Проблема в том, что эти ошибки приводят к тому, что Node выходит из строя. Я новичок во всей этой методологии асинхронного программирования, поэтому я не уверен, куда поместить мои операторы try / catch.

У меня есть вызов ajax, который идет на что-то вроде / check / site1. Сторона сервера, которая вызывает функцию, которая пытается установить соединение и затем возвращает 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.

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

Ответы [ 3 ]

60 голосов
/ 17 декабря 2011

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();
11 голосов
/ 03 декабря 2010

Я наткнулся на другое решение, когда я исследовал подобную проблему. http.Client выдает событие error, если соединение не может быть установлено по какой-либо причине. Если вы обработаете это событие, исключение не будет выдано:

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");

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

8 голосов
/ 01 декабря 2010

К сожалению, на данный момент нет способа отловить эти исключения напрямую, поскольку все это происходит асинхронно в фоновом режиме.

Все, что вы можете сделать, это поймать 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 в основном сервер, поэтому пропускная способность имеет значение.

Вы можете сообщить об ошибке , но имейте в виду, что сбои и т. Д. Имеют более высокий приоритет, чем функции, и большинство новых функций делают это с помощью запросов на разветвление.

Также для текущей Дорожной карты Node.js посмотрите этот доклад Райана Даля (Создателя Узла):
http://developer.yahoo.com/yui/theater/video.php?v=yuiconf2010-dahl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...