将Dynamo DB流数据解组为Json格式

时间:2018-09-26 06:00:22

标签: javascript node.js amazon-dynamodb aws-sdk-js

我必须将DDB流消息转换为普通的json类型。 为此,我正在使用

 unmarshalleddata = aws.DynamoDB.Converter.unmarshall(result.NewImage);

其中result.NewImage为

{ carrier: { S: 'SPRING' },
 partnerTransactionId: { S: 'a87ce47a46d7416586e0ece39f706d48' },
 shipmentId: { S: 'SPRING2200419561404932' },
 compressedShipmentPayload: 
  { B: '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' },
 correlationId: { S: 'ba40a7a721444c57aeafd7d739ffe7f6' },
 partnerId: { S: '697855049' },
 trackingNumber: { S: '3SDMZR6920882' },
 ttl: { N: '1538125523' },
 createDate: { S: '2018-09-21 09:05:23' } }

未编组的流是

{ carrier: 'SPRING',
  partnerTransactionId: 'a87ce47a46d7416586e0ece39c706d48',
  shipmentId: 'SPRING2200419561444932',
  compressedShipmentPayload: <Buffer 48 34 73 49 41 41 41 41 41 41 41 41 41 4f 31 62 2b 5a 50 69 52 72 4c 2b 56 7a 72 34 74 62 33 54 6b 72 67 61 52 37 79 49 46 57 64 44 49 33 46 4a 48 48 ... >,
  correlationId: 'ba40a7a711444c57aeafd7d739ffe7f6',
  partnerId: '697855049',
  trackingNumber: '3SDMZR6920881',
  ttl: 1538125523,
  createDate: '2018-09-21 09:05:23' }

一切都是正确的,除了compressedShipmentPayload的类型为B dynamo属性类型(实际上仅是通过dyamodb压缩实用程序压缩的GZIP文本)。解组后,其更改为Unit8ArrayBuffer。 我该如何处理而不将其转换为Unit8ArrayBuffer而是仅保留为压缩文本类型。

我也尝试过:

console.log(aws.DynamoDB.Converter.output({ 'M': result.NewImage }));

 var docClient =  new aws.DynamoDB.DocumentClient()
    //Create a Translator object, which comes from the DocumentClient
    var dynamodbTranslator = docClient.getTranslator();

    var ItemShape = docClient.service.api.operations.getItem.output.members.Item;
    result.NewImage  = dynamodbTranslator.translateOutput(result.NewImage, ItemShape);
    console.log(result.NewImage)

但是所有结果都相同。

2 个答案:

答案 0 :(得分:0)

我可以通过

解决它
var s = JSON.stringify(data.NewImage);
   s =  s.replace('"B":', '"S":');
   parserd_json = JSON.parse(s);
   unmarshalleddata = aws.DynamoDB.Converter.unmarshall(parserd_json);

如果有任何更好的解决方案。请提出建议。

答案 1 :(得分:0)

问题似乎是由于某种原因,unmarshall函数期望二进制B值已经是Buffer实例。如果它是字符串,则实际上将其编码为包含该字符串的utf8字节的Buffer

要在我的项目中解决该问题,我要做的是:

npm install deep-for-each
import * as deepForEach from 'deep-for-each';
import { DynamoDB } from 'aws-sdk';

export function eventImageUnmarhall(data: DynamoDB.AttributeMap): any {

    deepForEach(data, replaceBinaryBase64WithBuffer);
    return DynamoDB.Converter.unmarshall(data);
}

function replaceBinaryBase64WithBuffer(value: any, key: string | number, subject: any) {
    if (key === 'B' && typeof value === "string") {
        subject[key] = Buffer.from(<string>value, 'base64');
    }
}

然后您像这样使用它:

import {eventImageUnmarhall} from './dynamo-helpers';

//
//…
//

let unmarshalledData = eventImageUnmarhall(data.NewImage);