(DynamoDB) Условное выражение работает непредсказуемо с оператором '='. Как я мог отладить это лучше? - PullRequest
0 голосов
/ 07 мая 2018

Мои объекты в 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 голосов
/ 09 мая 2018

Я понял это. 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;
}
0 голосов
/ 08 мая 2018

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