我需要在DynamoDB中存储用户的信息,并在DynamoDB表中已经存在的情况下向同一用户发送邮件。我在for循环中这样做。该列表仅包含2条记录。问题是只有第二条记录被插入到表中,并且邮件被发送两次到同一用户。这是代码:
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");
}
});
}
这种奇怪行为可能是什么原因?真的很沮丧,我即将放弃。
答案 0 :(得分:2)
1)请注意DynamoDB 最终一致。如果插入项目并检查项目是否立即存在,则可能无法始终在数据库中找到该项目。
这意味着循环的第二次迭代可能并不总是找到插入表中的第一项。
2)如果该项目已存在于表格中,Put
api将更新该项目并给出成功的回复。
这意味着在第二次迭代中,Put会对同一email id
和department id
成功,因为如果记录已经存在,它会更新记录。
GetItem - GetItem操作返回一组属性 与主键匹配的项目。 GetItem操作提供了一个 最终默认一致读取。如果最终一致读 对于您的应用程序是不可接受的,请使用ConsistentRead。
PutItem - 创建新项目,或用新项目替换旧项目 (包括所有属性)。如果项目中已存在 指定的表具有相同的主键,新项完全 替换现有项目。您还可以使用条件运算符 仅在属性值与特定条件匹配时替换项目, 或仅在该项目尚不存在时插入新项目。
根据以上几点,如果数组中有email id
和department id
,则可能会收到两封电子邮件。