DynamoDB возвращает неопределенное значение, но регистрируются ли данные в console.log (), asyn c? - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть функция, которая получает некоторые данные из DynamoDB, используя docClient.query (). Я могу получить данные и распечатать их на консоли, например, console.log(data)), но если я пытаюсь return data, я всегда получаю неопределенное значение.

Я подумал, что function (err,data){ ... } - это обратный вызов функции query(), и надеялся, что он подождет, пока значение будет доступно, прежде чем вернуться.

Очевидно, что я новичок с AWS SDK и asyn c функциями, не могу найти документацию, которая использовала return так, как мне нужно.

Мне просто нужен aliasHasRole, чтобы вернуть isAuthorized JSON, чтобы я мог использовать его в другом месте вне функции.

function aliasHasRole(an_alias, a_role) {
    const params = {
        TableName: 'xxxxxxx',
        KeyConditionExpression: '#alias= :alias AND #Role= :Role',
        ExpressionAttributeNames: {
            '#alias': 'alias',
            '#Role': 'Role'
        },
        ExpressionAttributeValues: {
            ':alias': an_alias,
            ':Role': a_role,
        },
    };

    docClient.query(params, function (err, data) {
        if (err) {
            console.log("Error when attempting table query, see below:\n\n" + 
JSON.stringify(err, null, 2));
            return err;
        } else {
            var isAuthorized = data.Count === 1 && data.Items[0].alias === an_alias && data.Items[0].Role === a_role ? true : false;
            console.log(1,'Access', isAuthorized ? 'Granted' : 'Denied', 'for alias "' + an_alias + '".\n');
            return isAuthorized; //always returns undefined
        }
    })
}

console.log(aliasHasRole("fooAlias","barRole")) // returns undefined.

1 Ответ

1 голос
/ 04 февраля 2020

Конечно, это проблема, связанная с асинхронным кодом. Если вы можете использовать docClient.query с синтаксисом async / await , тогда вы можете дождаться его выполнения и вернуть значение в соответствии с его результатом. Вы также можете использовать синтаксис Promise , если необходимо знать значение err (если оно существует). Затем вы также можете использовать разрешение / отклонение в вашей функции.

Решение с синтаксисом async / await :

async function aliasHasRole(an_alias, a_role) {
    const params = {
        TableName: 'xxxxxxx',
        KeyConditionExpression: '#alias= :alias AND #Role= :Role',
        ExpressionAttributeNames: {
            '#alias': 'alias',
            '#Role': 'Role'
        },
        ExpressionAttributeValues: {
            ':alias': an_alias,
            ':Role': a_role,
        }
    };
    const data = await docClient.query(params);
    if (!data) return false;
    const isAuthorized = data.Count === 1 && data.Items[0].alias === an_alias && data.Items[0].Role === a_role ? true : false;
    return isAuthorized;
};

aliasHasRole("fooAlias", "barRole").then(console.log).catch(console.log);

ОБНОВЛЕНИЕ

Что действительно помогает, так это выполнение запроса с .promise(). Затем он может быть легко выполнен и обработан с использованием синтаксиса then / catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...