Тест лямбда-функции никогда не проходит

Я пытаюсь заставить свою первую функцию Lambda работать, но я не могу получить тест для записи в мой DynamoDB. До этого момента я следовал инструкциям по AWS.

Вот моя лямбда-функция (небольшая модификация из учебника, чтобы соответствовать моей БД):

'use strict';

console.log('Loading function');

const doc = require('dynamodb-doc');

const dynamo = new doc.DynamoDB();


/**
 * Provide an event that contains the following keys:
 *
 *   - operation: one of the operations in the switch statement below
 *   - tableName: required for operations that interact with DynamoDB
 *   - payload: a parameter to pass to the operation being performed
 */
exports.handler = (event, context, callback) => {
    console.log('Received event:', JSON.stringify(event, null, 2));
    console.log('\nPayload:', event.Item);
    console.log('event table', event.TableName);
    console.log('\nEvent:', event);
    const operation = event.operation;
    const payload = event.Item;

    // if (event.tableName) {
    //     payload.TableName = event.tableName;
    // }

    switch (operation) {
        case 'create':
            dynamo.putItem(payload, callback);
            break;
        case 'read':
            dynamo.getItem(payload, callback);
            break;
        case 'update':
            dynamo.updateItem(payload, callback);
            break;
        case 'delete':
            dynamo.deleteItem(payload, callback);
            break;
        case 'list':
            dynamo.scan(payload, callback);
            break;
        case 'echo':
            callback(null, payload);
            break;
        case 'ping':
            callback(null, 'pong');
            break;
        default:
            callback(new Error(`Unrecognized operation "${operation}"`));
    }
};

Вот моя тестовая полезная нагрузка:

{
    "TableName": "EVENTS",
    "operation": "create",
    "Item" : { 
        "userID": "2",
        "kidNo": 2,
        "note": "Testing",
        "timeStamp": "timer1"
    }
}

И вот один из ответов, которые я получаю:

{
  "errorMessage": "There were 6 validation errors:\n* MissingRequiredParameter: Missing required key 'TableName' in params\n* MissingRequiredParameter: Missing required key 'Item' in params\n* UnexpectedParameter: Unexpected key 'userID' found in params\n* UnexpectedParameter: Unexpected key 'kidNo' found in params\n* UnexpectedParameter: Unexpected key 'timeStamp' found in params\n* UnexpectedParameter: Unexpected key 'note' found in params",
  "errorType": "MultipleValidationErrors",
  "stackTrace": [
    "* MissingRequiredParameter: Missing required key 'TableName' in params",
    "* MissingRequiredParameter: Missing required key 'Item' in params",
    "* UnexpectedParameter: Unexpected key 'userID' found in params",
    "* UnexpectedParameter: Unexpected key 'kidNo' found in params",
    "* UnexpectedParameter: Unexpected key 'timeStamp' found in params",
    "* UnexpectedParameter: Unexpected key 'note' found in params",
    "ParamValidator.validate (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:40:28)",
    "Request.VALIDATE_PARAMETERS (/var/runtime/node_modules/aws-sdk/lib/event_listeners.js:125:42)",
    "Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:105:20)",
    "callNextListener (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:95:12)",
    "/var/runtime/node_modules/aws-sdk/lib/event_listeners.js:85:9",
    "finish (/var/runtime/node_modules/aws-sdk/lib/config.js:315:7)",
    "/var/runtime/node_modules/aws-sdk/lib/config.js:333:9",
    "EnvironmentCredentials.get (/var/runtime/node_modules/aws-sdk/lib/credentials.js:126:7)",
    "getAsyncCredentials (/var/runtime/node_modules/aws-sdk/lib/config.js:327:24)",
    "Config.getCredentials (/var/runtime/node_modules/aws-sdk/lib/config.js:347:9)"
  ]
}

Я понимаю, что это говорит мне (я думаю), но я также не понимаю, потому что я не могу это исправить! Я перепробовал все предложения в ошибке, и они не уходят. Я чувствую, что мне не хватает чего-то простого.

1 ответ

Решение

Похоже, что полезная нагрузка, которая была передана в DynamodB, была неправильной, так как payload был удален только для объектов в Item (из вашего тестового события).

const payload = event.Item;
// the value of payload from above line:
// payload = {
//    "userID": "2",
//    "kidNo": 2,
//    "note": "Testing",
//    "timeStamp": "timer1"
// }

Простой взлом, который вы можете попробовать

const payload = {
    TableName: event.TableName,
    Item: event.Item
}
Другие вопросы по тегам