как обрабатывать необработанное исключение в ответе http.get

У меня есть этот код, чтобы вытащить новостную ленту со стороннего веб-сайта с помощью API. Он настроен на запуск каждые 5 секунд и получение любых новостных транзакций, которые могут произойти. Проблема, по-видимому, заключается в том, что новых транзакций не происходит.

Добавив process.on('uncaught exception', function(error){ console.log("hmph") }) задание cron может продолжиться через 5 секунд, поэтому у меня возник соблазн оставить его как есть; однако я добавил console.log("hmph") и теперь запутался.

В первый раз консоль напишет hmph. Через 5 секунд будет написано хмф хмф

и так далее. Я знаю, что должен что-то упустить, но я не совсем уверен, что именно. Я пытался в операторе else сделать request.end(), но ошибка все еще срабатывает.

Без process.on('uncaught...') возникает ошибка:

events.js:71 выбрасывать аргументы[1]; // Необработанное событие «ошибка» ^ Ошибка: ошибка разбора в Socket.socketOnData (http.js:1367:20) в TCP.onread (net.js:403:27)

с proccess.on('uncaught...') console.log(ошибка):

{ [Ошибка: Ошибка синтаксического анализа] bytesParsed: 161, код: «HPE_INVALID_CONSTANT» }

Как мне правильно обработать эту ошибку?

Сокращенный код:

var job = new cronJob('*/5 * * * * *', function(){
  var request = http.get({
                            host: 'www.example.com',
                            path: '/news_feed?apicode=myapicode',
                            port: 80,
                            headers: { 'accept-encoding': 'gzip' } 
                         })

  request.on('response', function(response){
    if (response.statusCode == 200){
      // gunzip response, save response to mongodb
    } 
    else
    {
      // here is where the error is occuring
      process.on('uncaughtException',function(error){
        console.log(error);
        console.log("hmph");
    }
  });
}, null, true);

person thtsigma    schedule 18.01.2013    source источник


Ответы (1)


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

Изучение ошибки и обсуждение этого типа ошибки здесь: https://github.com/joyent/node/issues/3354 Похоже, сервер, к которому вы подключаетесь, делает что-то странное. Вероятно, самое простое решение для вас — использовать обработчик uncaughtException. Тем не менее, это далеко не идеально, и вы не должны делать это в качестве общего решения будущих проблем, подобных этой.

var job = new cronJob('*/5 * * * * *', function(){
  var request = http.get({
    host: 'www.example.com',
    path: '/news_feed?apicode=myapicode',
    port: 80,
    headers: { 'accept-encoding': 'gzip' } 
  });
  request.on('response', function(response){
    if (response.statusCode == 200){
      // gunzip response, save response to mongodb
    }
  });
}, null, true);

process.on('uncaughtException',function(error){
  console.log(error);
  console.log("hmph");
});
person loganfsmyth    schedule 18.01.2013
comment
Я ценю ваш ответ; однако я уже пытался это сделать и получаю: events.js:71 throw arguments[1]; // Необработанное событие «ошибка» ^ Ошибка: ошибка разбора в Socket.socketOnData (http.js:1367:20) в TCP.onread (net.js:403:27) - person thtsigma; 18.01.2013
comment
А вы уверены, что привязываетесь в том же месте, что я сказал? Вы не помещаете ошибку в обратный вызов ответа, как у вас был обработчик uncaughtException - person loganfsmyth; 18.01.2013
comment
Да, проверил, на том же месте. Вот полный код с вашим предложением. pastebin.com/PTu7cA8s - person thtsigma; 18.01.2013
comment
Упс, в этом коде, строка 28, .on('error') была чем-то, с чем я игрался, пытаясь проверить это в различных местах. В любом случае, та же ошибка все еще происходит. Я действительно ценю вашу помощь :) - person thtsigma; 18.01.2013
comment
Спасибо за помощь. Есть ли способ очистить старые обработчики ошибок, чтобы они не накапливались? Я беспокоюсь о том, что в конечном итоге будет много обработчиков, и какое влияние это может иметь? - person thtsigma; 18.01.2013
comment
@thtsigma не будет накапливаться с тем, что я опубликовал. Вам нужно привязать обработчик вне cronjob. - person loganfsmyth; 18.01.2013