Node.js поймать и повторить попытку ECONNRESET

В моем коде AWS Lambda Node.js есть следующий код, который вызывает метод post для индексации документа в сервисе AWS Elasticsearch:

var endpoint = 'ABC-XYZ.us-east-1.es.amazonaws.com';

exports.handler = function(input, context) {
    ...

    // post documents to the Amazon Elasticsearch Service
    post(endpoint, elasticsearchBulkData, function(error, success, statusCode, failedItems) {
        if (error) {
          console.info('...');

          if (failedItems && failedItems.length > 0) {
            console.info(...);
          }

          // NOTE: Instead of failing, we are forcing a success, as we do not want retries
          context.succeed('Success');
        } else {
          // console.info('Success: ' + JSON.stringify(success));
          context.succeed('Success');
        }
      });
    }

   ...
   ...
function post(endpoint, body, callback, lastTimeout) {
  lastTimeout || (lastTimeout = 500);
  var requestParams = buildRequest(endpoint, body);

  var request = https.request(requestParams, function(response) {
    var responseBody = '';
    response.on('data', function(chunk) {
      responseBody += chunk;
    });
    response.on('end', function() {
      var info = JSON.parse(responseBody);
      var failedItems;
      var success;

      if (response.statusCode >= 200 && response.statusCode < 299) {
        failedItems = info.items.filter(function(x) {
          return x.index.status >= 300;
        });

        success = { ...};
      }

      var error = response.statusCode !== 200 || info.errors === true ? {
        "statusCode": response.statusCode,
        "responseBody": responseBody
      } : null;

      callback(error, success, response.statusCode, failedItems);
    });
  }).on('error', function(e) {
    console.error(e.stack || e);
    //callback(e);
    lastTimeout *= 2;
    console.info('lastTimeout: ' + lastTimeout + " for cluster: " + endpoint) ;
    setTimeout(function() {
      post(endpoint, body, callback, lastTimeout);
    }, lastTimeout);
  });
  request.end(requestParams.body);
}

...

Иногда я получаю Error: socket hang up ECONNRESET.

Мой вопрос: Что было бы лучшим способом поймать эту ошибку и повторить попытку?

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

Версия Node.js — 4.3.

Я думал об использовании Promise с resolve и reject, но, будучи новичком в JS, я не уверен, как использовать обещание в своем почтовом вызове.

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
3 283
1

Ответы 1

У меня есть приложение узла, которое время от времени выдает исключение, которое я не могу поймать:

Error: read ECONNRESET at TLSWrap.onread (net.js:622:25)

Не знаю, имеет ли это отношение к вашей проблеме, но вроде да. После некоторых исследований кажется, что это ошибка: https://github.com/nodejs/node/issues/23237, и она была устранена в последней версии.

Прямо сейчас я использую Node версии 8, и я заметил, что вы используете версию 4. Я обновлю рабочий сервер в ближайшем будущем, возможно, вы тоже сможете попробовать это. Если на вопрос не будет ответа, пока я не обновлю свой сервер, я вернусь сюда с результатами.

Спасибо. К сожалению, я не могу обновиться до 8, потому что это может сломать много вещей других людей. Для меня проблема возникла из-за того, что Lambda индексировала 2 разных кластера ES, и решение заключалось в настройке context.succeed ТОЛЬКО после успешного выполнения ОБА запросов на публикацию. Установка context.succeed до того, как 2-й пост был успешным, сделает недействительным обработчик соединения.

Sandeep Kanabar 21.02.2019 02:24

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