DynamoDB 上的更新不一致

问题描述 投票:0回答:1

我实现了一个 lambda 函数。在测试过程中,项目属性的更新似乎不一致。大部分时候不更新,很少更新。

这是我的代码片段。

const Responses = require('../common/API_Responses.js');
const Dynamo = require('../common/Dynamo.js');

const tableName = process.env.collectionTableName;

exports.handler = async event => {
    console.log('event', event);

    if(!event.pathParameters || !event.pathParameters.collection_id) {
        return Responses._400({message: 'Missing parameters'});
    }

    const data = JSON.parse(event.body);
    const ID = event.pathParameters.collection_id;
    console.log(data);
    let res = {};
    let isKey = false;
    Object.keys(data).forEach(function(key) {
        
        if (key == 'collection_name' || key == 'sex' || key == 'designer' || key == 'period') {
            console.log('key', key);
            isKey = true;
            res = Dynamo.edit(ID, tableName, key, data[key]);
        } 
    });

    if (isKey) {
        return Responses._200({message: `ID: ${ID} has been updated.`, res});
    } else {
        return Responses._400({message: `ID: ${ID} has not been updated.`, res});
    }
    
}

Dynamo.js
片段

const Dynamo = {
    async edit (ID, tableName, updateKey, updateValue) {
        let keyName = '';
        
        if (tableName == collectionTableName) {
            keyName = 'Collection_ID';
        } else if (tableName == patternTableName) {
            keyName = 'Pattern_ID';
        } else {
            throw Error('tableName unidentified.');
        }

        const params = {
            TableName: tableName,
            Key: {[keyName]: ID},
            UpdateExpression: 'SET #updateKey = :updateValue',
            ExpressionAttributeValues: {
                ':updateValue' : updateValue
            },
            ExpressionAttributeNames: {
                '#updateKey': updateKey,
            },
            ReturnValues: 'ALL_NEW'
        };

        console.log(params);

        let res = '';
        res = await documentClient.update(params, function(err, data) {
            if (err) {
                throw Error(err);
            } else {
                return data
            }
        }).promise();

        console.log('res', res);
        return res
    },
}

希望有人可以帮助我。预先感谢。

我已经搜索并尝试过调试,但碰壁了。

aws-lambda amazon-dynamodb aws-sdk-js
1个回答
0
投票

您熟悉 JavaScript 的工作原理及其固有的异步特性吗?在您的代码中,您无法等待任何异步函数,因此会强制 lambda 结束,因为它没有等待更新发生。

res = await Dynamo.edit(ID, tableName, key, data[key]);
© www.soinside.com 2019 - 2024. All rights reserved.