(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

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

问题:

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

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