Проблема при создании запроса к DynamoDB с помощью лямбды (Node.js) - PullRequest
0 голосов
/ 27 марта 2020

Я хочу сделать запрос, чтобы вернуть все записи с определенным идентификатором пользователя, в данном случае Will666. У меня есть primaryKey и sortKey.

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({region: 'eu-west-2', apiVersion: '2012-08-10'});

exports.handler =  (event, context, callback) => {


    const params = {

        TableName: "signalepisodes",
        KeyConditionExpression: "userID = :a",
        ExpressionAttributeValues: {
        ":a": "Will666"
    }

    };
    dynamodb.query(params, function(err, data){
          if (err) {
            console.log(err);
            callback(err);
        } else {
            console.log(data);
              const items = data.Items.map(
                (dataField) => {
                  return { userID: dataField.userID.S, uploadDate: dataField.uploadDate.N, epTitle: dataField.epTitle.S };
              } 

                );

            callback(null, items);

        }
    });
    };

Я получаю это сообщение об ошибке при тестировании. Я предполагаю, что мой синтаксис неправильный, но я не могу разобраться.

"errorType": "MultipleValidationErrors",

моя таблица DynamoDB выглядит так:

enter image description here

1 Ответ

1 голос
/ 27 марта 2020

DynamoDB SDK имеет два типа клиента:

  1. клиент низкого уровня: new AWS.DynamoDB(...)
  2. клиент высокого уровня: new AWS.DynamoDB.DocumentClient(...)

В настоящее время вы используете # 1, но вы предоставляете атрибуты для своего запроса, как если бы вы использовали клиент документа # 2.

Итак, либо переключитесь на DocumentClient и продолжайте использовать:

{":a": "Will666"}

Или придерживайтесь низкоуровневого клиента и измените свои атрибуты, указав типы значений, например:

{":a": {"S": "Will666"}}

Я бы порекомендовал DocumentClient , поскольку он значительно упрощает маршалинг и демаршаллинг данных.

Я бы также порекомендовал обновить ваш код со старого асинхронного кода в стиле обратного вызова до новых опций на основе Promise. Например, что-то вроде этого:

exports.handler = async (event, context) => {
    const params = {
        TableName: "signalepisodes",
        KeyConditionExpression: "userID = :a",
        ExpressionAttributeValues: { ":a": "Will666" }
    };

    const items = await dynamodb.query(params).promise();

    for (const item of items) {
        console.log('Item:', item);
    }

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