Как поймать http -исключения запроса клиента в node.js
-
29-09-2019 - |
Вопрос
У меня есть приложение 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