(DynamoDB)ConditionExpression表现不可预测的' ='运营商。我怎样才能更好地调试它?

时间:2018-05-07 16:38:29

标签: amazon-dynamodb aws-sdk aws-sdk-nodejs

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

2 个答案:

答案 0 :(得分:0)

AWS SDK目前不支持await/async。请参阅此类issue

  

SDK当前依赖于CLS来跟踪调用上下文。它没有   现在使用async / await功能。你可以看到   讨论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));
});

答案 1 :(得分: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;
}
相关问题