Как поймать http -исключения запроса клиента в node.js

StackOverflow https://stackoverflow.com/questions/4328540

Вопрос

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

У меня есть звонок Ajax, который идет на что -то вроде /check /site1. На стороне сервера, которая вызывает функцию, которая пытается создать соединение, а затем вернуть CatusCode. Это очень простая функция, и я обернул каждую линию в попытке/улову, и она никогда ничего не ловит. Вот:

function checkSite(url){
    var site = http.createClient(80, url);
    var request = site.request('GET', '/', {'host': url});
    request.end();
    return request;
  }

Даже с каждой из этих линий, завернутых в попытку/поймать, я все равно буду получать непредубежные исключения, такие как Ehostunreach и так далее. Я хочу иметь возможность поймать их и вернуть это к вызову Ajax.

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

Это было полезно?

Решение

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

Другие советы

Я наткнулся на другое решение, когда изучал аналогичную проблему. 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");

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

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

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

Ты сможешь подать ошибку Хотя, но будьте осторожны с авариями и т. Д.

Также для нынешней дорожной карты узла.
http://developer.yahoo.com/yui/theater/video.php?v=yuiconf2010-dahl

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top