我正在使用 Dynamodb 流对记录进行一些处理,因为它们被添加或修改到我的表中。我还在我的应用程序中使用 Dynamoose 模型。
Dynamodb 流事件将一个事件对象传递给我的 node.js lambda 处理程序,其中包括对象record.dynamoDb.NewImage
和record.dynamoDb.OldImage
. 但是,这些对象采用 DynamoDB 的 AttributeValue 格式,包括所有数据类型(“S”表示字符串),而不是普通的 javascript 对象。就这样record.id
变成了record.id.S
。
Dynamoose 模型允许您从对象实例化模型,如下所示new Model(object)
:但是,它希望该参数是一个普通对象。
我知道 Dynamoose 有一个 dynamodb 解析器,我认为它的 Schema.prototype.dynamodbparse()。但是,这并没有按预期工作。
import { DYNAMODB_EVENT } from '../../constant';
import _get from 'lodash/get';
import { Entry } from '../../model/entry';
import { applyEntry } from './applyEntry';
async function entryStream(event) {
await Promise.all(
event.Records.map(async record => {
// If this record is being deleted, do nothing
if (DYNAMODB_EVENT.Remove === record.eventName) {
return;
}
// What I've tried:
let entry = new Entry(record.dynamodb.NewImage);
// What I wish I could do
entry = new Entry(Entry.schema.dynamodbparse(record.dynamodb.newImage));
await applyEntry(entry);
})
);
}
export const handler = entryStream;
那么有没有办法从 DynamoDB 的 AttributeValue 格式实例化一个 Dynamoose 模型呢?有没有其他人这样做过?
另一种方法是,我只是从 中提取密钥record
,然后使用 访问数据库,Model.get({ id: idFromEvent });
但我认为这效率低下,因为记录只是从流中交给我的。