Хобрук: Ваш путь к мастерству в программировании

Ошибки при использовании лямбда-функции для удаления записи из DynamoDB, но запись все равно удалена

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

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

При тестировании на шлюзе API я получаю в ответ «Внутренняя ошибка сервера», но проверка таблицы показывает, что элемент удален, а журналы показывают мне удаленную запись (согласно предоставлению ReturnValues: "ALL_OLD" в params, переданных в 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);
                }
            })
        });

    }
}

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


  • Все функции SDK имеют метод .promise (), который можно использовать вместо использования обратных вызовов и создания собственных обещаний. Например: rsp = ожидание documentClient.delete (...). Обещание () 04.04.2019
  • Будет ли это в рамках нового обещания или вместо? Когда я пробую это немедленно в функции delete, я получаю Parsing error: unexpected token documentClient при использовании с await. 04.04.2019

Ответы:


1

Вот пример того, как использовать обещания с 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.

04.04.2019

2

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

Внесите следующие изменения в 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;
    }
};
04.04.2019
  • Обновили код, чтобы отразить это, однако я все еще получаю сообщение undefined is not a function error, очевидно, происходящее из строки return resolve(...data.Attributes) файла deleteTrip.js. 04.04.2019
  • Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..