dynamodb DeleteItem работает, но обратный вызов возвращает неопределенное значение

#node.js #amazon-web-services #amazon-dynamodb

#node.js #amazon-веб-сервисы #amazon-dynamodb

Вопрос:

У меня есть созданная мной лямбда-функция DeleteItem, которая удаляет элемент, если найден его идентификатор пользователя. Идентификатор пользователя передается как a pathParameter , и он работает без проблем, если идентификатор пользователя найден.

 let output = await deleteUser(userId);
console.log("output: "   JSON.stringify(output))
 

всегда возвращает output: undefined

каждый раз, независимо от того, найдено и удалено оно или нет. Мне нужен ответ от deleteItem операции, чтобы я мог вернуть сообщение User not found или User deleted на основе этого ответа.

Как я могу заставить обратный вызов dynamodb работать должным образом?

delete.js

 const AWS = require('aws-sdk');
AWS.config.update({ region: 'us-east-1' });

const dynamoDB = new AWS.DynamoDB();

const tableName = process.env.TABLE_NAME;

exports.handler = async (event) => {

    let userId = event.pathParameters.userid;

    try {
        let output = await deleteUser(userId);
        console.log("output: "   JSON.stringify(output))
        return {
            statusCode: 200,
            body: JSON.stringify({
                message: "User deleted"
            })
        };


    } catch (err) {
        console.log("ERROR TIME")
        console.log("ERROR:"   err)

        return {
            statusCode: 500,
            body: JSON.stringify({
                message: "User failed to be deleted"
            })
        };

    }


    async function deleteUser(userId) {
        let params = {
            TableName: tableName,
            "Key": {
                "userid": {
                    "S": userId.toString()
                }
            }
        };
        try {
            const dbResponse = await dynamoDB.deleteItem(params).promise();

            console.log("dbResponse")
            console.log(dbResponse)

            if (dbResponse.Item) {
                console.log(`deleted row with userId of ${userId}`);
                return (dbResponse);
            }
        } catch (err) {
            console.log(`user reset failed with ${err}`);
            return {
                statusCode: 500,
                body: JSON.stringify({
                    errr: err
                })
            };
        }
    }


};
 

Ответ №1:

Это связано dbResponse с тем, что у него нет имени свойства Item , поэтому это условие никогда не выполняется:

  if (dbResponse.Item) {
 

Я предлагаю просмотреть документацию, чтобы узнать, каков ожидаемый формат ответа, или, по крайней мере, войти dbResponse , чтобы вы могли видеть, что возвращается.

Комментарии:

1. Я добавил журнал консоли const dbResponse = await dynamoDB.deleteItem(params).promise(); в исходный вопрос для демонстрации. В первый раз я попытался удалить идентификатор пользователя, который не существует. Во второй раз я удалил элемент, который существует (успешно). Оба раза вывод console.log(dbResponse) был {} , даже если Item не является именем свойства, он должен возвращать что-то при выполнении операции DeleteItem . У вас есть какие-либо предположения о том, почему это происходит?

2. Как вы думаете, почему он всегда должен что-то возвращать? Вы не устанавливаете ReturnConsumedCapacity ReturnItemCollectionMetrics или ReturnValues , поэтому он ничего не вернет. Пожалуйста, найдите время, чтобы прочитать документацию.

3. Спасибо за совет!