【发布时间】:2020-08-16 14:12:15
【问题描述】:
我的 Lambda 接收包含 ID 和地址的 SQS 消息。它解析出这些字段,并在 dynamo 表中更新与该 ID 关联的记录。
本次更新的参数包含以下逻辑
1.记录的id等于SQS发送的ID
2.SortKey 的值等于“null”(注意,null 是一个值为“null”的字符串)
3.用新地址更新地址字段
我发现此功能存在以下问题
函数未更新 DynamoDB 实例
我没有收到来自更新电话的任何反馈。查看代码有几个 console.logs 应该执行但不是。请参阅更新后的 Try,Catch,Finally 块。查看日志,您可以看到这些不会输出到控制台。这里有些不对劲。 finally 不执行看起来像未定义的行为,我唯一的猜测是没有等待对 dynamodb 的调用
我还需要实现以下功能。这是加分项,如果您知道如何操作,请随时发表评论!
目前更新只会将地址的字段名从一个值更改为另一个值。相反,我需要记录包含一组与该记录关联的地址。为此,我们需要实现以下逻辑
如果记录中不存在一组地址,则创建一个以地址为唯一元素的集合 如果学生记录中确实存在集合,请使用地址更新该集合。不应添加重复的地址
这个函数的代码如下。我还附上了此功能的最新 CloudWatch 日志,以及我尝试更新的记录(记录上的地址字段是手动添加的)。你会注意到在 console.log("starting upload") 之后我们没有得到任何 console.logs,并且在检查时 Promise 的状态是“PENDING”。我们也没有从 dynamodb 更新中得到任何反馈。目前该功能没有更新记录,也没有给我任何反馈,说明为什么它没有这样做。
const util = require('util')
const aws = require('aws-sdk');
const docClient = new aws.DynamoDB.DocumentClient();
exports.handler = async(event) => {
event.Records.forEach(async record => {
const { body } = record;
const test = JSON.parse(body);
console.log(test);
const message = JSON.parse(test["Message"]);
console.log(message);
const id = message.id;
const name = message.Name;
const address = message.address;
console.log("parameters parsed");
console.log("record being processed is " + id);
const params = {
TableName: "My_Records",
Key: {
"ID": ":id",
"SortKey": ":sortKey"
},
//KeyConditionExpression: 'SortKey = :sortKey',
UpdateExpression: "set info.address = :address",
ExpressionAttributeValues: {
':id': id,
':address': address,
':sortKey': "null"
},
ReturnValues: "UPDATED_NEW"
};
console.log(params)
console.log("starting upload")
try {
let putObjectPromise = docClient.update(params).promise();
console.log(util.inspect(putObjectPromise, {showHidden: false, depth: null}))
putObjectPromise.then(function(data) {
console.log("UpdateItem succeeded:");
}).catch(function(err) {
console.log("Unable to update item. Error JSON:" + err);
}).finally(() =>
console.log("done with upload")
);
return putObjectPromise
}
catch (err) {
console.err(err)
}
});
};
此函数最近执行的 CloudWatch 日志
INFO {
Type: 'Notification',
MessageId: 'ID',
TopicArn: 'ARN',
Subject: 'DB updated',
SignatureVersion: '1',
INFO { id: '11111111', Name: 'Jerms Macgee', address: '102 homeslice lane' }
INFO parameters parsed
INFO record being processed is 11111111
INFO {
TableName: 'my_table',
Key: { ID: ':id', SortKey: ':sortKey' },
UpdateExpression: 'set info.address = :address',
ExpressionAttributeValues: {
':id': '11111111',
':address': '102 homeslice lane',
':sortKey': 'null'
},
ReturnValues: 'UPDATED_NEW'
}
INFO starting upload
INFO Promise { <pending> }
END RequestId
这是我希望更新的记录示例
{
"address": "test",
"SortKey": "null",
"id": 11111111
"name": James Mcgee
}
更新的记录应该是
{
"address": "102 homeslice lane",
"SortKey": "null",
"id": 11111111
"name": James Mcgee
}
对于奖励积分,我真的很想做类似的事情
{
"address": {"102 homeslice lane"},
"SortKey": "null",
"id": 11111111
"name": James Mcgee
}
其中地址是可以保存其他记录的集合
【问题讨论】:
标签: javascript node.js promise aws-lambda amazon-dynamodb