(DynamoDB) ConditionExpression 在使用“=”运算符时行为异常。我怎样才能更好地调试它?
(DynamoDB) ConditionExpression behaves unpredictably with an '=' operator. How could I debug it better?
我在 Dynamodb 中的对象大致如下所示:
{
userId: "GEFOeE8EsaWmq4NQ3oh7tbeVkLx1",
url: 'objectURL',
object: {}
}
当拥有对象的用户请求删除时,我有一段简单的代码用于删除对象。顺便说一句,这里的用户参数是经过解析的 JWT。
export async function deleteObject(user, url) {
let params = {
TableName: OBJECTS_TABLE,
Key: {
url: url,
},
ConditionExpression: `userId = :uid`,
ExpressionAttributeValues: {
":uid": {
S: user.sub
}
}
};
let deleteResult = await dynamoDb.delete(params).promise();
return deleteResult;
}
问题是它不起作用,我已通过将 =
更改为 <>
来确保问题出在 ConditionExpression 上。我只是得到这个:
ConditionalCheckFailedException: The conditional request failed
我确定解决问题不难,但我几乎没有任何信息
问题:
- 为什么条件表达式失败?一切看起来都很好,它应该可以工作。对吗?
- 我怎样才能更好地调试这个问题?
AWS SDK 目前不支持 await/async
。请参考这个类似的 issue.
The SDK currently relies on CLS to trace the call context. It doesn't
work with async/await functionality right now. You can see the
discussion here.
如果您删除 await
,它应该可以工作。下面的示例:-
let deleteResult = dynamodb.deleteItem(params).promise();
deleteResult.then(function (data) {
console.error("Delete item result :", JSON.stringify(data,
null, 2));
}).catch(function (err) {
console.error("Delete item result error :", JSON.stringify(err,
null, 2));
});
我明白了。可以直接使用 ExpressionAttributeValues,而无需提及数据类型。 Javascript SDK 会自动执行此操作。
export async function deleteObject(user, url) {
let params = {
TableName: OBJECTS_TABLE,
Key: {
url: url,
},
ConditionExpression: `userId = :uid`,
ExpressionAttributeValues: {
":uid": user.sub
}
};
let deleteResult = await dynamoDb.delete(params).promise();
return deleteResult;
}
我在 Dynamodb 中的对象大致如下所示:
{
userId: "GEFOeE8EsaWmq4NQ3oh7tbeVkLx1",
url: 'objectURL',
object: {}
}
当拥有对象的用户请求删除时,我有一段简单的代码用于删除对象。顺便说一句,这里的用户参数是经过解析的 JWT。
export async function deleteObject(user, url) {
let params = {
TableName: OBJECTS_TABLE,
Key: {
url: url,
},
ConditionExpression: `userId = :uid`,
ExpressionAttributeValues: {
":uid": {
S: user.sub
}
}
};
let deleteResult = await dynamoDb.delete(params).promise();
return deleteResult;
}
问题是它不起作用,我已通过将 =
更改为 <>
来确保问题出在 ConditionExpression 上。我只是得到这个:
ConditionalCheckFailedException: The conditional request failed
我确定解决问题不难,但我几乎没有任何信息
问题:
- 为什么条件表达式失败?一切看起来都很好,它应该可以工作。对吗?
- 我怎样才能更好地调试这个问题?
AWS SDK 目前不支持 await/async
。请参考这个类似的 issue.
The SDK currently relies on CLS to trace the call context. It doesn't work with async/await functionality right now. You can see the discussion here.
如果您删除 await
,它应该可以工作。下面的示例:-
let deleteResult = dynamodb.deleteItem(params).promise();
deleteResult.then(function (data) {
console.error("Delete item result :", JSON.stringify(data,
null, 2));
}).catch(function (err) {
console.error("Delete item result error :", JSON.stringify(err,
null, 2));
});
我明白了。可以直接使用 ExpressionAttributeValues,而无需提及数据类型。 Javascript SDK 会自动执行此操作。
export async function deleteObject(user, url) {
let params = {
TableName: OBJECTS_TABLE,
Key: {
url: url,
},
ConditionExpression: `userId = :uid`,
ExpressionAttributeValues: {
":uid": user.sub
}
};
let deleteResult = await dynamoDb.delete(params).promise();
return deleteResult;
}