Распаковка потоковых данных Dynamo DB в формат Json

Я должен перевести сообщение потока DDB в обычный тип JSON. Для этого я использую

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

где результат. 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' }

Все правильно, кроме compressShipmentPayload, который имеет тип атрибута динамо B (на самом деле сжатый текст GZIP только с помощью утилиты сжатия dyamodb) . После демаршаллинга его значение меняется на 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)

Но все приводит к одинаковым результатам.

1 ответ

Проблема заключается в том, что unmarshall функция ожидает двоичный B значения уже быть Buffer экземпляр по какой-то причине. Если это строка, то она фактически кодирует строку как Buffer содержащий строку utf8 байтов.

Чтобы обойти это в моем проекте, я сделал следующее:

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);

Я могу решить это

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

Если у кого-то есть лучшее решение. Пожалуйста, предложите.

Другие вопросы по тегам