DynamoDB NodeJS SDK从V2迁移至V3:Set类型数据获取差异问题
解决DynamoDB V3 SDK返回原生Set替代V2自定义Set的问题
为啥会出现这个差异
AWS JS SDK V3 默认把DynamoDB里的NS(数字集合)、SS(字符串集合)直接转成原生JS Set对象,而V2用的是SDK自己封装的Set结构(带wrapperName、values、type那套字段)。这是V3在数据反序列化(把DynamoDB格式转成JS对象)时的默认行为,和你排查的编组(marshalling,把JS对象转成DynamoDB格式)没关系。
两种解决办法
办法1:改反序列化配置,返回V2风格的Set
如果你用@aws-sdk/util-dynamodb里的unmarshall函数处理查询结果,加个convertToNative: false参数就行:
import { unmarshall } from "@aws-sdk/util-dynamodb"; // 假设这是getItem拿到的原始DynamoDB格式数据 const rawItem = { "hitCount": { "NS": ["5", "4", "3", "2", "1"] } }; // 配置后返回和V2一致的Set结构 const item = unmarshall(rawItem, { convertToNative: false }); console.log(item.hitCount); // 输出:{ wrapperName: 'Set', values: [5,4,3,2,1], type: 'Number' }
要是你用的是DynamoDBDocumentClient(V3的文档客户端,默认帮你做序列化反序列化),创建客户端时要配置unmarshallOptions:
import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb"; import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; const client = new DynamoDBClient({}); const docClient = DynamoDBDocumentClient.from(client, { unmarshallOptions: { convertToNative: false } });
办法2:手动把原生Set转成你要的格式
不想改全局配置的话,拿到结果后自己转一下:
// 假设V3 getItem返回的item里,hitCount是原生Set const { Item } = await docClient.send(new GetItemCommand(params)); const hitCount = { wrapperName: "Set", values: Array.from(Item.hitCount), type: "Number" };
内容的提问来源于stack exchange,提问作者gnichola
相关产品推荐
相关产品推荐

