首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生态环境下的Node.js捕获与重试

生态环境下的Node.js捕获与重试
EN

Stack Overflow用户
提问于 2019-02-07 20:23:48
回答 1查看 4.4K关注 0票数 2

在我的AWS Node.js代码中,我遵循了调用post方法将文档索引到AWS服务的代码:

代码语言:javascript
复制
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);
}

...

有时我会得到Error: socket hang up ECONNRESET

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

我添加了基于setTimeout这个答案片段,它看起来确实有效,但我不确定这样做是否正确。

Node.js版本为4.3。

我正在考虑使用Promiseresolvereject,但作为一个JS新手,我不知道如何利用承诺在我的帖子电话。

我还浏览了此链接,但不清楚如何用fetch_retry来结束我的帖子

EN

回答 1

Stack Overflow用户

发布于 2019-02-08 20:48:48

我有一个节点应用程序,它不时抛出一个我无法捕捉到的异常:

代码语言:javascript
复制
Error: read ECONNRESET at TLSWrap.onread (net.js:622:25)

我不知道这是否与你的问题有关,但似乎是这样的。经过一些研究,这似乎是一个bug:https://github.com/nodejs/node/issues/23237,并已在上一个版本中得到了解决。

现在我正在运行noticed 8,我注意到您正在使用版本4。我将在不久的将来更新生产服务器,也许您也可以这样做。如果问题没有答案,直到我更新了我的服务器,我将返回这里的结果。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54581696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档