【问题标题】:AWS Lambda Function works when tested on console, but not when CloudWatch event triggers itAWS Lambda 函数在控制台上测试时有效,但在 CloudWatch 事件触发时无效
【发布时间】:2019-01-24 06:26:54
【问题描述】:

我在节点中编写了一个推特机器人,它转发一些从搜索返回的推文。我已经将它与 Webpack 捆绑并使用 AWS Lambda 进行部署。我已将 cloudWatch 事件设置为每小时触发一次该功能。 我已经记录了函数的开始和结束,以及函数成功/不成功转发的每次。

当我在本地运行它时它可以工作。当我在 Lambda 管理控制台上对其进行测试时,它可以工作。但是,在我的 CloudWatch Logs 中,开始日志和结束日志之间没有长距离。有趣的是,如果我将事件触发率降低到

这是测试日志。该功能按预期工作。

START RequestId: 8f2a4423-5aca-447e-9d24-a18b8c5ff510 Version: $LATEST
2019-01-23T18:18:42.111Z    8f2a4423-5aca-447e-9d24-a18b8c5ff510    Start
2019-01-23T18:18:42.312Z    8f2a4423-5aca-447e-9d24-a18b8c5ff510    Error retweeting
2019-01-23T18:18:42.312Z    8f2a4423-5aca-447e-9d24-a18b8c5ff510    You have already retweeted this Tweet.
2019-01-23T18:18:42.352Z    8f2a4423-5aca-447e-9d24-a18b8c5ff510    Error retweeting
2019-01-23T18:18:42.352Z    8f2a4423-5aca-447e-9d24-a18b8c5ff510    You have already retweeted this Tweet.
2019-01-23T18:18:42.352Z    8f2a4423-5aca-447e-9d24-a18b8c5ff510    Error retweeting
2019-01-23T18:18:42.352Z    8f2a4423-5aca-447e-9d24-a18b8c5ff510    You have already retweeted this Tweet.
2019-01-23T18:18:42.352Z    8f2a4423-5aca-447e-9d24-a18b8c5ff510    End
END RequestId: 8f2a4423-5aca-447e-9d24-a18b8c5ff510
REPORT RequestId: 8f2a4423-5aca-447e-9d24-a18b8c5ff510  Duration: 881.20 ms Billed Duration: 900 ms     Memory Size: 128 MB Max Memory Used: 64 MB  

这是我的代码。

const learnInPublicRetweet = async () => {
  const query = '#SomeHashtag';
  const params = {
    q: query,
    result_type: 'recent',
    lang: 'en'
  };
  console.log('Start');
  let data = await T.get('search/tweets', params);
  const { statuses } = data.data;
  statuses.forEach(async ({ id_str: id, user }) => {
    if (user.id_str !== '1032750379597946880') {
      try {
        await T.post('statuses/retweet/:id', { id });
        console.log(`Retweeted tweet with id ${id}`);
      } catch (err) {
        console.log('Error retweeting');
        console.log(err.message);
      }
    }
  });
  console.log('End');
};

exports.retweet = learnInPublicRetweet;

这是我的 cloudwatch 日志


16:44:13 START RequestId: 34df836d-c9b3-4b9a-9547-8f3be7ed5297 Version: $LATEST
16:44:14 2019-01-23T16:44:14.159Z   34df836d-c9b3-4b9a-9547-8f3be7ed5297    Start
16:44:14 2019-01-23T16:44:14.938Z   34df836d-c9b3-4b9a-9547-8f3be7ed5297    End
16:44:14 END RequestId: 34df836d-c9b3-4b9a-9547-8f3be7ed5297

【问题讨论】:

    标签: node.js amazon-web-services aws-lambda bots amazon-cloudwatch


    【解决方案1】:

    您的代码中可能有几处错误。

    1. 全局变量缓存,阅读更多best practices

      尝试更改它:async function learnInPublicRetweet() { ... }

    2. 您正在使用 forEach 循环,我确信它不适用于异步调用。它将触发所有异步调用并立即返回。如果迭代对象的可枚举属性,您将需要使用 for .. offor .. in

    【讨论】:

    • 非常感谢。这是 forEach 循环与异步调用的不兼容。for .. of 循环修复了它。
    猜你喜欢
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2019-04-30
    • 2011-03-15
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 2020-04-15
    相关资源
    最近更新 更多