0

我正在使用 Dynamodb 流对记录进行一些处理,因为它们被添加或修改到我的表中。我还在我的应用程序中使用 Dynamoose 模型。

Dynamodb 流事件将一个事件对象传递给我的 node.js lambda 处理程序,其中包括对象record.dynamoDb.NewImagerecord.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 });但我认为这效率低下,因为记录只是从流中交给我的。

4

1 回答 1

0

我通过AWS.DynamoDB.Converter.unmarshall在传递给 Dynamoose 之前解析对象来解决它。

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;
于 2019-08-22T22:32:48.727 回答