【发布时间】:2017-12-11 22:23:41
【问题描述】:
在节点 js 中,我尝试使用 batchWriteItem() 将记录写入 dynamoDB 表。
在第一次调用函数 insertTransactionDetails() 时,我发送 9 条记录以插入,而在第二次调用同一函数时,我发送 2 条记录。
每次运行时插入到表中的最终记录都不同。
测试 1: 我看到第一次调用的 4 条记录,其次是第二次调用的 2 条记录,然后是第一次函数调用的 3 条记录。 测试 2: 我看到第一次调用的 2 条记录,然后是第二次调用的 2 条记录,然后是第一次函数调用的 5 条记录。
预期结果是看到第一次函数调用的 9 条记录,然后是第二次函数调用的 2 条记录。
我还注意到,由于某种原因,每次只插入 9 条记录,而不是总共 11 条记录 (9+2)。
我尝试了很多调试和在线搜索,但无法理解根本原因。我非常感谢有人帮助我在这里找到问题。非常感谢。
函数被称为 insertTransactionDetails(dataToInsert,0,bulkSearchParams)。 dataToInsert[][] 是一个二维数组。对于此测试数据,它的大小将分别为 2 个调用的 dataToInsert[0][9] 和 dataToInsert[0][2]。
batchWriteItem() 返回的数据粘贴在下方,显示 UnprocessedItems 为空 {},这让我相信表配置不是问题。
下面是代码。
Logs: Bulk Search - insertTransactionDetails() - Success path: **{\"UnprocessedItems\":{},\"ConsumedCapacity\":[{\"TableName\":\"RaptorBulkSearchRequestTransactionDetails\",\"CapacityUnits\":18}]}**
dataToInsert[i][j] =
{
PutRequest: {
Item: {
'RequestID' : {S: bulkSearchParams.operationId.concat('-',bulkSearchParams.sourceID)},
'TimeStamp': {N: epochTime.toString()},
'TransactionID': {S: bulkSearchParams.cardNumber.toString().concat('-',data.response.transactionRecords[j].GUID)},
'TransactionItem': {S: JSON.stringify(data.response.transactionRecords[j])}
}
}
};
function insertTransactionDetails (dataToInsert,index,bulkSearchParams){
if (index < dataToInsert.length){
// Call DynamoDB to add the item to the table
var batchRequest = {
RequestItems: {
"RaptorBulkSearchRequestTransactionDetails": dataToInsert[index]
},
"ReturnConsumedCapacity": "TOTAL"
};
dynamodb.batchWriteItem(batchRequest, function(err, data) {
if (err) {
logErrorMessage(`Bulk Search - insertTransactionDetails() - Failure path: ${err}`, "routes.bulkSearch", bulkSearchParams.operationId, "NA");
index++;
insertTransactionDetails(dataToInsert,index,bulkSearchParams); //increment index for dataToInsert and insert the next set
} else {
logInfoMessage(`Bulk Search - insertTransactionDetails() - Success path: ${JSON.stringify(data)}`, "routes.bulkSearch", bulkSearchParams.operationId, "NA");
index++;
insertTransactionDetails(dataToInsert,index,bulkSearchParams); //increment index for dataToInsert and insert the next set
}
});
}
else{
//proceed to the next card if available
bulkSearchParams.index ++; //incrementing the index for cardNumber
processBulkSearch(bulkSearchParams);
}
}
【问题讨论】:
标签: javascript node.js amazon-dynamodb aws-sdk dynamo-local