我正在创建一个 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 中发生的情况并解决问题?非常感谢!
当您使用低级客户端时,您还必须使用 DynamoDB JSON 定义您的
ExpressionAttributeValues
...例如:
{
":c": { "S": "Black" },
":p": { "N": "500" }
}
我相信您还应该使用文档中提到的数据类型扩展 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 )