2010-12-01 2 views
31

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

У меня есть вызов 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/уловом, я все еще получаю неперехваченные исключения, как EHOSTUNREACH и так далее. Я хочу иметь возможность поймать их и вернуть их на вызов ajax.

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

ответ

52

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

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

Все, что вы можете сделать, это поймать uncaughtException «S самостоятельно:

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 - это в основном сервер, поэтому пропускной способности.

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

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

+0

Наиболее информативным. Ответ. Когда-либо. Что вы рекомендовали, так это то, как я на данный момент настроен, но не вариант, поскольку я буду проверять несколько сайтов и вам нужны ответы для каждого. На данный момент я рассмотрю другие маршруты до тех пор, пока не будет добавлена ​​обработка исключений. Это действительно облом, что эти типы ошибок просто остаются плавающими вверх. – mattmcmanus 2010-12-01 20:28:14

11

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

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