首页 > 解决方案 > (DynamoDB) ConditionExpression 使用“=”运算符时的行为不可预测。我怎样才能更好地调试它?

问题描述

我在 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;
}

问题是它不起作用,我通过更改=<>. 我只是得到这个: ConditionalCheckFailedException: The conditional request failed

我确信解决问题并不难,但我几乎没有任何信息

问题:

  1. 为什么条件表达式失败?一切看起来都很好,它应该可以工作。对?
  2. 我怎样才能更好地调试这个问题?

标签: amazon-dynamodbaws-sdkaws-sdk-nodejs

解决方案


AWS SDK目前await/async不支持。请参考这个类似的问题

SDK 当前依赖 CLS 来跟踪调用上下文。它现在不适用于 async/await 功能。你可以在这里看到讨论。

如果你删除它应该可以工作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));
});

推荐阅读