AWS Lambda 函数无法更新数据但错误消息为空

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

我正在创建一个 Node.js 应用程序,其中一些 Lambda 函数会改变通过 API 以原子方式调用的数据。 创建函数运行完美,但具有相同结构的更新函数给出“无法更新成员数据”(其中成员是要更新的表),但错误消息为空。 这段代码是:

    const ddb = new DynamoDBClient({ region: 'eu-central-1' });

    const { MemberId, ...updateFields } = JSON.parse(event.body);
    let updateExpression = "SET ";
    const expressionAttributeValues = {};
    Object.keys(updateFields).forEach((key, index) => {
        updateExpression += `${key} = :val${index}, `;
        expressionAttributeValues[`:val${index}`] = updateFields[key];
    });
    updateExpression = updateExpression.slice(0, -2);

    const params = {
        TableName: "Members",
        Key: {
            //MemberId: { N: MemberId.toString() }
            MemberId: { N: MemberId }
        },
        UpdateExpression: updateExpression,
        ExpressionAttributeValues: expressionAttributeValues
    };
    console.log('params:', JSON.stringify(params));

    try {
        const data = await ddb.send(new UpdateItemCommand(params));
        console.log('UpdateItemCommand response:', data);
        if (!data.Attributes) {
            responseBody = 'Member not found';
            statusCode = 404;
        } else {
            responseBody = 'Member successfully updated';
            statusCode = 200;
        }
    } catch (err) {
        responseBody = 'Unable to update Member data: ' + JSON.stringify(err);
        statusCode = 403;
    }

回复是:

{
  "headers": {
    "Content-type": "application/json"
  },
  "statusCode": 403,
  "body": "Unable to update Member data: {}"
}

Function Logs
START RequestId: c4ddd7c2-4ba8-4c32-b0c0-552e823befce Version: $LATEST
2024-04-08T08:54:54.083Z    c4ddd7c2-4ba8-4c32-b0c0-552e823befce    INFO    params: {"TableName":"Members","Key":{"MemberId":{"N":"7807077375424"}},"UpdateExpression":"SET FirstName = :val0, AddressCity = :val1","ExpressionAttributeValues":{":val0":"James G.",":val1":"Dundee, UK"}}
END RequestId: c4ddd7c2-4ba8-4c32-b0c0-552e823befce
REPORT RequestId: c4ddd7c2-4ba8-4c32-b0c0-552e823befce  Duration: 244.31 ms Billed Duration: 245 ms Memory Size: 128 MB Max Memory Used: 83 MB  Init Duration: 329.88 ms

变量params已正确赋值,表中存在MemberId键值。

我添加了变量数据来记录 ddb.send 的响应,但错误发生在 ddb.send 本身上,并且 err 为空。将 MemberId 转换为字符串不会改变结果。

如何检测 ddb.send 中发生的情况并解决问题?非常感谢!

amazon-web-services aws-lambda amazon-dynamodb
2个回答
1
投票

当您使用低级客户端时,您还必须使用 DynamoDB JSON 定义您的

ExpressionAttributeValues
...例如:

{
    ":c": { "S": "Black" },
    ":p": { "N": "500" }
}

0
投票

我相信您还应该使用文档中提到的数据类型扩展 expressionAttributes Value 的 JSON 对象https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ExpressionAttributeValues.html

还看到 403,想知道您是否具有 IAM 策略中定义的用于将项目添加到 dynamodb 的正确访问权限 (https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html )

© www.soinside.com 2019 - 2024. All rights reserved.