0

我在 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. 我怎样才能更好地调试这个问题?
4

2 回答 2

0

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));
});
于 2018-05-08T14:38:07.957 回答
0

我想到了。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;
}
于 2018-05-09T17:32:20.170 回答