Javascript Node.js捕获并重试EconReset

Javascript Node.js捕获并重试EconReset,javascript,node.js,aws-lambda,econnreset,Javascript,Node.js,Aws Lambda,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,

在我的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.log('...');

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

          // NOTE: Instead of failing, we are forcing a success, as we do not want retries
          context.succeed('Success');
        } else {
          // console.log('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.log('lastTimeout: ' + lastTimeout + " for cluster: " + endpoint) ;
    setTimeout(function() {
      post(endpoint, body, callback, lastTimeout);
    }, lastTimeout);
  });
  request.end(requestParams.body);
}

...
var端点='ABC-XYZ.us-east-1.es.amazonaws.com';
exports.handler=函数(输入,上下文){
...
//将文档发布到Amazon Elasticsearch服务
post(端点、elasticsearchBulkData、函数(错误、成功、状态码、failedItems){
如果(错误){
console.log(“…”);
if(failedItems&&failedItems.length>0){
控制台日志(…);
}
//注意:我们不是失败,而是强制成功,因为我们不希望重试
成功(“成功”);
}否则{
//log('Success:'+JSON.stringify(Success));
成功(“成功”);
}
});
}
...
...
函数post(端点、正文、回调、lastTimeout){
lastTimeout | |(lastTimeout=500);
var requestParams=buildRequest(端点,主体);
var request=https.request(requestParams,函数(响应){
var-responseBody='';
响应.on('data',函数(块){
responseBody+=块;
});
on('end',function(){
var info=JSON.parse(responseBody);
var失效模式;
var成功;
如果(response.statusCode>=200&&response.statusCode<299){
failedItems=info.items.filter(函数(x){
返回x.index.status>=300;
});
成功={…};
}
var error=response.statusCode!==200 | | info.errors===true{
“statusCode”:response.statusCode,
“responseBody”:responseBody
}:null;
回调(错误、成功、response.statusCode、failedItems);
});
}).on('error',函数(e){
控制台错误(e.stack | | e);
//撤回(e);
lastTimeout*=2;
log('lastTimeout:'+lastTimeout+”对于集群:“+endpoint”);
setTimeout(函数(){
post(端点、正文、回调、最后超时);
},最后超时);
});
request.end(requestParams.body);
}
...
有时我会收到
错误:套接字挂起EconReset

我的问题是:捕获此错误并重试的最佳方法是什么?

我添加了基于的
setTimeout
代码段,看起来它确实有效,但我不确定这样做是否正确

Node.js的版本是4.3

我想用
Promise
resolve
reject
一起使用
Promise,但作为一名JS新手,我不知道如何在我的post call中使用Promise


我也经历过,但不清楚如何用
fetch\u retry

包装我的post调用。我有一个节点应用程序,它不时抛出一个我无法捕获的异常:

Error: read ECONNRESET at TLSWrap.onread (net.js:622:25)
我不知道这是否与你的问题有关,但似乎是这样。 经过一些研究,这似乎是一个bug:在上一个版本中已经解决了


现在我正在运行NodeVersion8,我注意到您正在使用Version4。我将在不久的将来更新生产服务器,也许您也可以尝试一下。如果问题在我更新服务器之前没有答案,我会带着结果回来。

谢谢。不幸的是,我无法升级到8,因为它可能会破坏其他人的很多东西。对我来说,出现这个问题是因为Lambda索引到两个不同的ES集群,解决方案在于设置
context.success
仅在两个post请求都成功之后。在第二次发布成功之前设置context.success将使连接处理程序无效