Ошибки при использовании лямбда-функции для удаления записи из DynamoDB, но запись по-прежнему удаляется - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь удалить запись из DynamoDB, используя Lambda и API-шлюз. В настоящее время идентификатор записи передается в качестве параметра запроса, который передается моей лямбда-функции deleteRecord и используется в функции удаления documentClient.

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

При тестировании на API-шлюзе я получаю «Внутреннюю ошибку сервера» в качестве ответа, но проверка таблицы показывает, что элемент удален, а в журналах показана запись, которая была удалена (согласно предоставлению ReturnValues: "ALL_OLD" в параметрах , переданных в documentClient).

При тестировании на Lambda напрямую (вручную вставляя идентификатор в мою функцию dt.delete ), я получаю следующее:

Response:
{
  "errorMessage": "RequestId: xxxxxxxxxxxxxxxxxxxx Process exited before completing request"
}

Request ID:
"xxxxxxxxxxxxxxxxxxxx"

Function Logs:
START RequestId: xxxxxxxxxxxxxxxxxxxx Version: $LATEST
2019-04-04T10:21:55.637Z    xxxxxxxxxxxxxxxxxxxx    Promise { <pending> }
2019-04-04T10:21:55.938Z    xxxxxxxxxxxxxxxxxxxx    TypeError: undefined is not a function
    at Response.<anonymous> (/var/task/deleteTrip.js:28:28)
    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:364:18)
    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:683:14)
    at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:685:12)
END RequestId: xxxxxxxxxxxxxxxxxxxx
REPORT RequestId: xxxxxxxxxxxxxxxxxxxx  Duration: 941.48 ms Billed Duration: 1000 ms    Memory Size: 128 MB Max Memory Used: 67 MB  
RequestId: xxxxxxxxxxxxxxxxxxxx Process exited before completing request

Несмотря на ошибку, запись в этом случае также удаляется из таблицы.

Я следовал документации DocumentClient для удаления записи, однако она не объясняет, как передать ответ (вместо этого просто регистрирует данные от обратного вызова), поэтому я не уверен, что это моя проблема.

Лямбда-функции
Index.js:

const deleteTrip = require('./deleteTrip.js');
const dt = new deleteTrip();

exports.handler = async (event) => {
    return dt.delete(event.queryStringParameters['Id']);
};

deleteTrip.js:

const AWS = require('aws-sdk');

let documentClient = new AWS.DynamoDB.DocumentClient({
    'region': 'eu-west-1'
});

module.exports = class deleteTrip {
    delete(Id) {
        return new Promise((resolve, reject) => {
            if (typeof Id !== 'string') throw `Expected: "String", received: ${typeof Id}`;
            let params = {
                TableName: "xyzDataTable",
                Key: {
                    tripId: Id
                },
                ReturnValues: "ALL_OLD",
                Exists: true
            };
            documentClient.delete(params, function(err, data) {
                if (err) {
                    console.log("Error deleting record from dynamoDB:", err);
                    console.log(params);
                    return reject(err);
                } else {
                    return resolve(...data.Attributes);
                }
            })
        });

    }
}

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

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Вот пример того, как использовать обещания с DynamoDB DocumentClient (или, собственно, и с низкоуровневыми API DynamoDB):

const AWS = require('aws-sdk');

let documentClient = new AWS.DynamoDB.DocumentClient({
    'region': 'eu-west-1'
});

class deleteTrip {
    delete(Id) {
        const params = {
            TableName: "xyzDataTable",
            Key: {
                tripId: Id
            },
            ReturnValues: "ALL_OLD",
            Exists: true
        };
        return documentClient.delete(params).promise();
    }
}

const testing = async (id) => {
    try {
        const dt = new deleteTrip();
        const data = await dt.delete(id);
        console.log("Success:", data);

    } catch(err) {
        console.log("Error:", err);
    }
}

testing(101);

Также обратите внимание, что операция удаления будет успешной, то есть не будет сообщать о какой-либо ошибке, если вы попытаетесь удалить несуществующий элемент. Это считается успешным, и это просто характер DynamoDB.

0 голосов
/ 04 апреля 2019

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

Внести следующие изменения в index.js

const deleteTrip = require('./deleteTrip.js');
const dt = new deleteTrip();

exports.handler = async (event) => {
    try{
        var result = await dt.delete(event.queryStringParameters['Id']);
        return res;
    }
    catch(err){
        //if the delete function throws an error or the promise rejects
        return err;
    }
};
...