Проверить, содержит ли таблица DynamoDB ключ, и вернуть логическое значение

Я только начал работать с Node.js и AWS DynamoDB и столкнулся с очень простой проблемой. Я ищу способ вернуть логическое значение, если в таблице существует определенный ключ. Итак, вот код, который у меня есть до сих пор:

    const AWS = require('aws-sdk')
const TOKEN_TABLE = process.env.TOKENS_TABLE
const dynamoDb = new AWS.DynamoDB.DocumentClient()

module.exports = {
    isValid: function (token) {
        const params = {
            TableName: TOKEN_TABLE,
            Key:
            {
                token: token
            }
        }
  
        var exists = false
        dynamoDb.get(params, (error, result) => {
            if (result.Item)
                exists = true
            else
                exists = false
        })
    return (exists)
    }
}

Когда я вызываю эту функцию, значение «существует» никогда не изменяется после его объявления, даже если элемент, который я ищу, находится в таблице. Я просмотрел похожие вопросы, и ни один из них не мог мне помочь или, по крайней мере, объяснить, почему это происходит. Спасибо


person Goodwill Tshekela    schedule 05.12.2018    source источник
comment
Я думаю, что ваша логика неверна. Вы должны установить exists = true, если result.Item имеет значение true. Раньше я использовал логику, которая проверяет, существует ли она, говоря if (result.Item !== undefined && result.Item !== null). Кроме того, вам поможет отладка, если вы поместите операторы ведения журнала в свой код, которые выводятся в поток журнала Cloudwatch.   -  person Luke Becker    schedule 05.12.2018
comment
Да, я заметил этот логический недостаток. Спасибо   -  person Goodwill Tshekela    schedule 05.12.2018


Ответы (1)


Во-первых, DynamoDb.get возвращает обещание. Поэтому вы возвращаете «существует» до того, как ваше обещание завершится и вернется. Я нашел лучший способ и самый чистый способ обойти это, чтобы сделать вашу функцию асинхронной и дождаться возврата обещания.

Например,

const AWS = require('aws-sdk')
const TOKEN_TABLE = process.env.TOKENS_TABLE
const dynamoDb = new AWS.DynamoDB.DocumentClient()

module.exports = {
    isValid: async function (token) {
        const params = {
            TableName: TOKEN_TABLE,
            Key:
            {
                token: token
            },
            AttributesToGet: [
               'token'
            ]
        }
  
        var exists = false
        let result = await dynamoDb.get(params).promise();
        if (result.Item !== undefined && result.Item !== null) {
          exists = true
        }

        return (exists)
    }
}

person Luke Becker    schedule 05.12.2018
comment
@GoodwillTshekela нет проблем! Рад, что смог помочь - person Luke Becker; 06.12.2018
comment
Надеюсь, вы не возражаете - я добавил оптимизацию, которую обнаружил. Получите только минимально необходимые атрибуты, вас не интересует содержимое, только наличие - достаточно ключа. - person datashaman; 11.08.2020
comment
Вместо этого вы можете использовать result.Item != null - person pratikpc; 28.01.2021