Ошибка InvalidParameterType: ожидаемые params.Item ['pid'], чтобы быть структурой в DynamoDB

Примечание: все это происходит на локальном экземпляре DynamoDB.

Вот код, который я использовал для создания таблицы из оболочки DynamoDB:

var params = {
    TableName: "TABLE-NAME",
    KeySchema: [
        { AttributeName: "pid", 
          KeyType: "HASH"
        }
    ],
    AttributeDefinitions: [
        { AttributeName: "pid",
          AttributeType: "S"
        }
    ],
    ProvisionedThroughput: {
        ReadCapacityUnits: 1,
        WriteCapacityUnits: 1
    }
};


dynamodb.createTable(params, function(err, data) {
    if (err)
        console.log(JSON.stringify(err, null, 2));
    else
        console.log(JSON.stringify(data, null, 2));
});

Это функция, которая вызывается для добавления элементов в БД (в файле node.js):

function(request, response) {
  params = {
    TableName: 'TABLE-NAME',
    Item: {
      pid: 'abc123'
    }
  };
  console.log(params);
  dynamodb.putItem(params, function(err, data) {
    if (err)
      console.log(JSON.stringify(err, null, 2));
    else
      console.log(JSON.stringify(data, null, 2));
  });
}

Вывод, который я получаю:

{ TableName: 'TABLE-NAME',
  Item: { pid: 'abc123' } }   // THIS IS PARAMS
{
  "message": "There were 7 validation errors:\n* InvalidParameterType: Expected params.Item['pid'] to be a structure\n* UnexpectedParameter: Unexpected key '0' found in params.Item['pid']\n* UnexpectedParameter: Unexpected key '1' found in params.Item['pid']\n* UnexpectedParameter: Unexpected key '2' found in params.Item['pid']\n* UnexpectedParameter: Unexpected key '3' found in params.Item['pid']\n* UnexpectedParameter: Unexpected key '4' found in params.Item['pid']\n* UnexpectedParameter: Unexpected key '5' found in params.Item['pid']",
  "code": "MultipleValidationErrors",
  "errors": [
    {
      "message": "Expected params.Item['pid'] to be a structure",
      "code": "InvalidParameterType",
      "time": "2015-11-26T15:51:33.932Z"
    },
    {
      "message": "Unexpected key '0' found in params.Item['pid']",
      "code": "UnexpectedParameter",
      "time": "2015-11-26T15:51:33.933Z"
    },
    {
      "message": "Unexpected key '1' found in params.Item['pid']",
      "code": "UnexpectedParameter",
      "time": "2015-11-26T15:51:33.933Z"
    },
    {
      "message": "Unexpected key '2' found in params.Item['pid']",
      "code": "UnexpectedParameter",
      "time": "2015-11-26T15:51:33.933Z"
    },
    {
      "message": "Unexpected key '3' found in params.Item['pid']",
      "code": "UnexpectedParameter",
      "time": "2015-11-26T15:51:33.933Z"
    },
    {
      "message": "Unexpected key '4' found in params.Item['pid']",
      "code": "UnexpectedParameter",
      "time": "2015-11-26T15:51:33.934Z"
    },
    {
      "message": "Unexpected key '5' found in params.Item['pid']",
      "code": "UnexpectedParameter",
      "time": "2015-11-26T15:51:33.934Z"
    }
  ],
  "time": "2015-11-26T15:51:33.944Z"
}

Я не понимаю, почему или как он получает ключи 0, 1, 2, 3, 4 и 5, когда их нет при печати в предыдущей строке.

Кроме того, как я могу исправить ошибку Expected params.Item['pid'] to be a structure? Я объявил это как строку и пытаюсь сохранить строку!

Другие примечания: Тот же код, который я использовал в функции, прекрасно работает, когда я запускаю его в оболочке. Я также включил aws-sdk и настроил его как требуется:

var AWS = require('aws-sdk');
AWS.config.region = 'us-east-1';
AWS.config.endpoint = 'http://localhost:8000/'
var dynamodb = new AWS.DynamoDB();

Ответ 1

Метод putItem() класса AWS.DynamoDB ожидает, что объект params.Item будет отформатирован как представление AttributeValue. Это означает, что вам придется изменить это:

params = {
  TableName: 'TABLE-NAME',
  Item: {
    pid: 'abc123'
  }
};

В это:

params = {
  TableName: 'TABLE-NAME',
  Item: {
    pid: {
      S: 'abc123'
    }
  }
};

Если вы хотите использовать нативные объекты javascript, вам следует использовать класс AWS.DynamoDB.DocumentClient, который автоматически AWS.DynamoDB.DocumentClient типы Javascript в DynamoDB AttributeValues, например:

  • Строка → S
  • Номер → N
  • Логическое → BOOL
  • null → NULL
  • Array → L
  • Объект → М
  • Массивы типа Buffer, File, Blob, ArrayBuffer, DataView и JavaScript → B

Он предоставляет метод put(), который делегирует AWS.DynamoDB.putItem().

Ответ 2

Примечание. Этот ответ может быть недействительным, как указано в нескольких комментариях ниже.

Функция, которая должна быть использована для добавления записей в базу данных из nodejs будет put и не putItem, который используется в оболочке DynamoDB. Изменение вышеуказанной функции на следующее исправило ее.

function(request, response) {
  params = {
    TableName: 'TABLE-NAME',
    Item: {
      pid: 'abc123'
    }
  };
  console.log(params);
  dynamodb.put(params, function(err, data) {
    if (err)
      console.log(JSON.stringify(err, null, 2));
    else
      console.log(JSON.stringify(data, null, 2));
  });
}