我正在使用lambda函数,该函数将存储有关不同用户的信息。 我有一个属性,用户ID是我的主分区键,而storedObject是我的主排序键。 当我使用PutItem时,我希望它仅在storedObject属性中尚不存在的情况下添加该项目。
这是我的代码
var params = {
TableName: 'TrackItDB',
Item: {
'userID' : {S: currentUser},
'storedObject' : {S: itemName},
'lenderPerson' : {S: personName},
'objectStatus' : {S: 'lent'},
'transactionDate': {S: date},
}
};
....
const checkIfItemIsStoredParams = {
Key: {
"userID" : {
S: currentUser
},
"storedObject" : {
S: itemName
}
},
TableName: "TrackItDB"
};
.....
dynamodb.getItem(checkIfItemIsStoredParams, function(err, data) {
if (!data) {
// no match, add the item
console.log('Item did not exist, storing to DB');
console.log(params);
return dynamodb.putItem(params, function(err, data) {
if (err) {
console.log("Error", err);
} else {
console.log("Success", data);
}
});
}
else {
console.log('Get item succeeded', data);
}
}
});
我遇到的问题是,即使没有数据,它也总是将Get Item成功输出到控制台。我已经尝试过if(data)和if(!data),并且即使没有返回数据也都成功返回了get项。
答案 0 :(得分:1)
getItem
返回一个数组,即使找不到要查找的项目也是如此。因此,由于您要检查数据是否为空/未定义,因此条件语句将始终是真实的。您应该改为检查数据长度:
if (!data.length) { // item doesn't exit
// put new item
}
另一种解决方案是通过对DynamoDB进行一次调用而不是两次调用来简化您要执行的操作。如果您担心性能或AWS使用成本,这可能是个好主意。 putItem
具有参数ConditionExpression
,可让您根据指定条件对要更新的项目进行细粒度控制。
对于您来说,它可能看起来像这样:
var params = {
TableName: 'TrackItDB',
Item: {
'userID' : {S: currentUser},
'storedObject' : {S: itemName},
'lenderPerson' : {S: personName},
'objectStatus' : {S: 'lent'},
'transactionDate': {S: date},
},
ConditionExpression: 'attribute_not_exists(storedObject)'
};
dynamodb.putItem(params, function(err, data) {
if (err) {
console.log("Error", err);
} else {
console.log("Success", data);
}
});