NodeJS:如果不存在,则在dynamodb中插入logging

我需要将用户的信息存储在DynamoDB中,并在DynamoDB表中不存在的情况下将邮件发送给同一用户。 我正在做循环。 该列表只包含2个logging。 问题是只有第二个logging被插入到表中,邮件被发送两次给同一个用户。 这里是代码:

module.exports.AddUser = function(req, res, usersList, departmentId) { var _emailId = ""; var _userName = ""; var _departmentId = departmentId; for (var i = 0; i < usersList.length; i++) { _emailId = usersList[i].emailId; _userName = usersList[i].userName; var params = { TableName: "UsersTable", Key: { "emailId": _emailId, "departmentId": _departmentId } }; docClient.get(params, function(err, data) { if (!err) { if (!data.items) AddUserAndSendEmail("UsersTable", _emailId, _userName); //The above function is being called twice but for the same user. //It has a check so not inserting the same record twice but //sending two mails to the same user. } }); } res.end("success"); } function AddUserAndSendEmail(tableName, emailId, _userName) { var params = { TableName: tableName, Item: { "emailId": emailId, "departmentId": 101//Default Department } }; docClient.put(params, function(err, data) { if (!err) { //Send Email Code Here } else { console.log("error"); } }); } 

这个奇怪的行为可能是什么原因? 真的很沮丧,我即将放弃这一点。

1)请注意,DynamoDB 最终一致的 。 如果您插入项目并检查项目是否立即存在,它可能不总是在数据库中find该项目。

这意味着循环的第二次迭代可能不总是find插入到表中的第一个项目。

2)如果表中已经存在该项目, Put api会更新该项目并给出成功的响应。

这意味着Put将在第二次迭代中成功获得相同的email iddepartment id ,因为如果该logging已经存在,则更新该logging。

GetItem – GetItem操作返回与主键匹配的项目的一组属性。 GetItem操作默认提供最终一致的读取。 如果最终一致性读取对于您的应用程序不可接受,请使用ConsistentRead。

PutItem – 创build新项目,或用新项目(包括所有属性)replace旧项目。 如果某个项目已经存在于具有相同主键的指定表格中,则新项目将完全取代现有项目。 只有在属性值符合某些条件的情况下,才可以使用条件运算符来replace项目,或者仅在该项目不存在的情况下才插入新项目。

基于以上几点,如果您在arrays中具有相同的email iddepartment id ,则可能会收到两封电子邮件。