繁体   English   中英

AWS Lambda DynamoDB putItem 总是执行两次

[英]AWS Lambda DynamoDB putItem executed twice, always

很可能是愚蠢的问题,但找不到我所看到的 Lambda 行为的明确答案。
我已经创建了将虚拟记录放入 DynamoDB 表中的最简单的 Lambda 函数(以同步方式):

const AWS = require('aws-sdk');
var docClient = new AWS.DynamoDB.DocumentClient();

exports.handler = async (event, context) => {
    var myTable = 'my-secret-table-name';
    
    var i;
    for(i=0; i<10; i++){
        var params = {
            TableName:myTable,
            Item:{
                PK: i.toString(),
                SK: 'whatever'
                
            }
        };
                        
        await docClient.put(params, function(err, data) {
            if (err) {
                console.error("Error inserting to a table ", JSON.stringify(err, null, 2));
            } else {
                console.log("Insert successfull. Run: "+ i);
            }
        }).promise();
    }
    
    return "Success";
};

它运行良好,所需的记录插入到 DynamoDB 表中。 但是当我查看 lambda 日志时,我看到如下:

2020-11-18 21:57:06.674 插入成功。 运行:0
2020-11-18 21:57:06.696 插入成功。 运行:1
2020-11-18 21:57:06.773 插入成功。 运行:1
2020-11-18 21:57:06.775 插入成功。 运行:2
2020-11-18 21:57:06.856 插入成功。 运行:2
2020-11-18 21:57:06.875 插入成功。 运行:3
2020-11-18 21:57:06.933 插入成功。 运行:3
2020-11-18 21:57:06.936 插入成功。 运行:4
2020-11-18 21:57:07.012 插入成功。 运行:4
2020-11-18 21:57:07.054 插入成功。 运行:5
2020-11-18 21:57:07.153 插入成功。 运行:5
2020-11-18 21:57:07.156 插入成功。 运行:6
2020-11-18 21:57:07.433 插入成功。 运行:6
2020-11-18 21:57:07.513 插入成功。 运行:7
2020-11-18 21:57:07.567 插入成功。 运行:7
2020-11-18 21:57:07.594 插入成功。 运行:8
2020-11-18 21:57:07.645 插入成功。 运行:8
2020-11-18 21:57:07.693 插入成功。 运行:9
2020-11-18 21:57:07.747 插入成功。 运行:9

无论我运行该函数多少次,我总是让每个 `putItem` 执行两次。 我知道 lambda 保证“至少一次”处理,但它不应该至少有时执行一次而不是总是执行两次吗?
如果“至少一次”处理是“运行 0”执行一次而所有其他执行两次的原因?
解释将不胜感激。 尽管在这种特定情况下执行 `putItem` 并没有太大变化,但在更复杂的情况下,我正在开发它开始给我带来一些麻烦,我不知道我是否应该接受它,或者我的代码只是蹩脚的。
问候!

它实际上被执行了两次,因为您使用了多种相互冲突的方式来解决对 DynamoDB 的异步调用:

  • 您有一个内联回调函数,一旦执行结果准备好,它将被执行。
  • 您还可以使用 promise() 函数

两者都会导致调用的执行。 如果您删除promise()或回调函数的调用,则应该解决它。

请查看了解异步 JavaScript:回调、承诺和 Async/Await以了解有关不同方法之间的差异和相似之处的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM