Lambda调用DynamoDB返回带类型标识结果,如何获取纯键值对?
问题:DynamoDB查询返回带类型标识的格式,如何转为纯键值对?
场景说明
我正在学习Lambda,我的DynamoDB数据集模型如下:
{ "id": "String", "question": "String", "answer": "String", "learned": "Boolean" }
使用AWS员工协助编写的Lambda函数(基于@aws-sdk/client-dynamodb)执行Scan操作时,能成功返回结果,但格式包含数据类型标识,不符合预期:
实际返回格式:
{ "question": { "S": "What is the name of your Judo organization?" }, "learned": { "BOOL": false }, "Id": { "S": "2" }, "answer": { "S": "United States Judo Association" } }
期望返回格式:
{ "question": "What is the name of your Judo organization?", "learned": false, "Id": "2", "answer": "United States Judo Association" }
同时有疑问:这种带类型的结果是不是仅在Lambda测试中可见,实际JSON API返回不会包含?
解决方案
这不是DynamoDB表的配置问题,而是因为你使用的DynamoDBClient是AWS SDK的低级客户端,它返回的是DynamoDB原生数据格式(包含类型标识),不管是测试还是实际API返回都会是这个格式,必须手动处理转换。
有两种常用处理方式:
1. 使用unmarshall工具转换数据
从@aws-sdk/util-dynamodb导入unmarshall函数,遍历返回的Items逐个转换:
import { DynamoDBClient, ScanCommand } from "@aws-sdk/client-dynamodb"; import { unmarshall } from "@aws-sdk/util-dynamodb"; const client = new DynamoDBClient({}); export const handler = async function(event, context, callback) { const command = new ScanCommand({ TableName: "Vocabulary", }); const response = await client.send(command); // 将每个带类型的Item转为纯键值对 const formattedItems = response.Items.map(item => unmarshall(item)); formattedItems.forEach(item => console.log(item)); // 返回转换后的结果 return { Items: formattedItems }; };
2. 使用DynamoDBDocumentClient(更简便)
直接使用专门处理文档格式的客户端,它会自动完成类型转换,无需手动调用转换工具:
import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; import { DynamoDBDocumentClient, ScanCommand } from "@aws-sdk/lib-dynamodb"; const client = new DynamoDBClient({}); // 基于基础客户端创建文档客户端 const docClient = DynamoDBDocumentClient.from(client); export const handler = async function(event, context, callback) { const command = new ScanCommand({ TableName: "Vocabulary", }); const response = await docClient.send(command); response.Items.forEach(item => console.log(item)); return response; };
补充说明
不管是在Lambda测试控制台还是通过API Gateway等方式触发返回,只要使用DynamoDBClient,返回的都会是带类型标识的格式,必须通过上述方法转换才能得到纯键值对结构。
内容的提问来源于stack exchange,提问作者LOTUSMS
相关产品推荐
相关产品推荐

