2017-08-25 24 views
1

DynamoDBにユーザーの情報を格納し、DynamoDBテーブルに存在しない場合は同じユーザーにメールを送信する必要があります。私はforループでこれをやっています。リストには2つのレコードしか含まれていません。問題は、2番目のレコードだけがテーブルに挿入され、メールが同じユーザーに2回送信されることです。コードは次のとおりです。NodeJS:存在しない場合はdynamodbにレコードを挿入

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

他のエントリの電子メールIDは何ですか?これまでのコードは正しいはずです。 –

+0

@HeadhunterXamdどちらも違います。検証済み。 – user1640256

+0

'AddUserAndSendEmail'の背後にあるコードをチェック/表示することができますか?問題はその機能にある可能性があります。 –

答えて

0

1)DynamoDBは、最終的にはと一致するです。アイテムを挿入し、そのアイテムがすぐに存在するかどうかを確認すると、データベース内のアイテムが常に見つかるとは限りません。

これは、ループの2回目の反復を意味します。は、常にがテーブルに挿入された最初のアイテムを見つけるとは限りません。

2)アイテムが既にテーブルに存在する場合は、Put apiがアイテムを更新し、正常に応答します。

これは、レコードが既に存在する場合にレコードを更新するため、Putが2番目の繰り返しで同じemail iddepartment idに成功することを意味します。

GetItem - GetItem操作は、主キーと一致する アイテムの属性セットを返します。 GetItemオペレーションは、デフォルトでは の最終的に一貫した読み取りを提供します。最終的に整合性のある読み取り がアプリケーションに使用できない場合は、ConsistentReadを使用してください。

PutItem - 新しいアイテムを作成するか、古いアイテムを新しいアイテム (すべての属性を含む)に置き換えます。同じプライマリキーを持つ 指定されたテーブルにアイテムが既に存在する場合、新しいアイテムは完全に で置き換えられます。また、条件演算子を使用して、 の属性値が特定の条件( )と一致する場合にのみアイテムを置き換えるか、そのアイテムが存在しない場合にのみ新しいアイテムを挿入することもできます。上記の点を踏まえ

、あなたは配列にemail iddepartment id同じを持っている場合は2通の電子メールを取得する可能性があります。

関連する問題