В моем коде 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.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


У меня есть приложение узла, которое время от времени выдает исключение, которое я не могу поймать:
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-й пост был успешным, сделает недействительным обработчик соединения.