首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从DynamoDB的AttributeValue格式实例化Dynamoose模型?

如何从DynamoDB的AttributeValue格式实例化Dynamoose模型?
EN

Stack Overflow用户
提问于 2019-08-22 21:35:52
回答 1查看 842关注 0票数 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()。然而,这并不像预期的那样有效。

代码语言:javascript
复制
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 });访问数据库,但我认为这样做效率很低,因为记录是从流中传递给我的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-22 22:32:48

在传递到Dynamoose之前,我通过使用AWS.DynamoDB.Converter.unmarshall解析对象来解决这个问题。

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57617334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档