当记录被添加或修改到我的表中时,我使用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 });访问数据库,但我认为这样做效率很低,因为记录是从流中传递给我的。
发布于 2019-08-22 22:32:48
在传递到Dynamoose之前,我通过使用AWS.DynamoDB.Converter.unmarshall解析对象来解决这个问题。
import { DYNAMODB_EVENT } from '../../constant';
import _get from 'lodash/get';
import { Entry } from '../../model/entry';
import { applyEntry } from './applyEntry';
// https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/Converter.html#unmarshall-property
var AWS = require('aws-sdk');
var parseDynamo = AWS.DynamoDB.Converter.unmarshall;
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;
}
entry = new Entry(parseDynamo(record.dynamodb.newImage));
await applyEntry(entry);
})
);
}
export const handler = entryStream;https://stackoverflow.com/questions/57617334
复制相似问题