Я новичок в AWS.Как 3 дня новые.В одном из учебных пособий Amazon я нашел код для лямбда-функции, которая будет взаимодействовать с таблицей DynamoDB.В этом примере предоставляется только тестовый JSON для запроса GET, что приведет к созданию списка элементов в базе данных, но сам код поддерживает PUT, POST и DELETE для полного CRUD с таблицей.
Итак, я создал таблицу DynamoDB с именем «Users» с ключом раздела CompanyId , который является строкой, и ключом сортировки Email, который также является строкой.
Затем я создал лямбда-функцию и добавил код из учебника:
console.log('Loading function');
const doc = require('dynamodb-doc');
const dynamo = new doc.DynamoDB();
/**
* Demonstrates a simple HTTP endpoint using API Gateway. You have full
* access to the request and response payload, including headers and
* status code.
*
* To scan a DynamoDB table, make a GET request with the TableName as a
* query string parameter. To put, update, or delete an item, make a POST,
* PUT, or DELETE request respectively, passing in the payload to the
* DynamoDB API as a JSON body.
*/
exports.handler = (event, context, callback) => {
console.log('Received event:', JSON.stringify(event, null, 2));
const done = (err, res) => callback(null, {
statusCode: err ? '400' : '200',
body: err ? err.message : JSON.stringify(res),
headers: {
'Content-Type': 'application/json',
},
});
switch (event.httpMethod) {
case 'DELETE':
dynamo.deleteItem(JSON.parse(event.body), done);
break;
case 'GET':
dynamo.scan({ TableName: event.queryStringParameters.TableName }, done);
break;
case 'POST':
console.log(event.body);
dynamo.putItem(JSON.parse(event.body), done);
break;
case 'PUT':
dynamo.updateItem(JSON.parse(event.body), done);
break;
default:
done(new Error(`Unsupported method "${event.httpMethod}"`));
}
};
После тестирования кода GET (и получения длины 0)список элементов, так как моя таблица пуста), я решил создать тест, который бы добавил один элемент в базу данных.Я создал тестовое событие с именем PostTest и со следующим тестовым содержимым:
{
"httpMethod": "POST",
"body": "{\"Item\": {\"CompanyId\": {\"S\": \"test-company-id\"},\"FirstName\": {\"S\": \"John\"}, \"LastName\": {\"S\": \"Doe\"}, \"Email\": {\"S\": \"john.doe@gmail.com\"}, \"Password\": {\"S\": \"password\"}}, \"TableName\": \"Users\"}"
}
Я хочу отметить тот факт, что CompanyId установлен как«S», или, другими словами, установить тип строки.
Когда я запустил тест, я получил следующий ответ:
{
"statusCode": "400",
"body": "One or more parameter values were invalid: Type mismatch for key CompanyId expected: S actual: M",
"headers": {
"Content-Type": "application/json"
}
}
и содержимое журнала было:
START RequestId: 294a7414-cde5-11e8-a7bd-bd58483e1612 Version: $LATEST
2018-10-12T06:07:56.232Z 294a7414-cde5-11e8-a7bd-bd58483e1612 Received event: {
"httpMethod": "POST",
"body": "{\"Item\": {\"CompanyId\": {\"S\": \"test-company-id\"},\"FirstName\": {\"S\": \"John\"}, \"LastName\": {\"S\": \"Doe\"}, \"Email\": {\"S\": \"john.doe@gmail.com\"}, \"Password\": {\"S\": \"password\"}}, \"TableName\": \"Users\"}"
}
2018-10-12T06:07:56.232Z 294a7414-cde5-11e8-a7bd-bd58483e1612 {"Item": {"CompanyId": {"S": "test-company-id"},"FirstName": {"S": "John"}, "LastName": {"S": "Doe"}, "Email": {"S": "john.doe@gmail.com"}, "Password": {"S": "password"}}, "TableName": "Users"}
END RequestId: 294a7414-cde5-11e8-a7bd-bd58483e1612
REPORT RequestId: 294a7414-cde5-11e8-a7bd-bd58483e1612 Duration: 173.04 ms Billed Duration: 200 ms Memory Size: 512 MB Max Memory Used: 30 MB
Я озадачен ошибкойв ответе:
Type mismatch for key CompanyId expected: S actual: M
Если вы посмотрите в журнале, в теле запроса CompanyId установлено значение "S".Откуда взялась буква "М"?Что я сделал не так?
Само собой разумеется, что никакие пункты не были добавлены к моему столу.