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

时间:2017-08-25 07:26:55

标签: node.js amazon-dynamodb

我需要在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");
        }
    });
}

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

1 个答案:

答案 0 :(得分:2)

1)请注意DynamoDB 最终一致。如果插入项目并检查项目是否立即存在,则可能无法始终在数据库中找到该项目。

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

2)如果该项目已存在于表格中,Put api将更新该项目并给出成功的回复。

这意味着在第二次迭代中,Put会对同一email iddepartment id成功,因为如果记录已经存在,它会更新记录。

  

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

     

PutItem - 创建新项目,或用新项目替换旧项目   (包括所有属性)。如果项目中已存在   指定的表具有相同的主键,新项完全   替换现有项目。您还可以使用条件运算符   仅在属性值与特定条件匹配时替换项目,   或仅在该项目尚不存在时插入新项目。

根据以上几点,如果数组中有email iddepartment id,则可能会收到两封电子邮件。