Ошибка 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));
});
}