使用DynamoDB BatchGetCommand遇400错误:键与schema不匹配
解决DynamoDB BatchGetCommand返回"键元素不匹配schema"问题
核心问题原因
你使用的DynamoDBDocumentClient(从@aws-sdk/lib-dynamodb导入)是文档客户端,它会自动处理DynamoDB数据类型的序列化/反序列化,不需要手动指定{S: "xxx"}这类低级API的类型标记。之前你用的{ sku: { S: "RVR-8-F" }}格式是给原生DynamoDBClient用的,文档客户端会错误解析这个键结构,导致出现schema不匹配错误。
正确的BatchGetCommand写法
直接使用原生JS类型的键格式,和你之前正常工作的GetCommand/QueryCommand保持一致:
case "POST /validate-cart": body = await dynamo.send( new BatchGetCommand({ RequestItems: { "AllinsonMTG-Stock": { Keys: [ { sku: "RVR-8-F" }, // 用原生字符串,无需类型标记,多sku可继续添加 ], ProjectionExpression: "sku, stock" } } }) ); // 注意:BatchGetCommand返回数据在Responses字段中,而非Items body = body.Responses["AllinsonMTG-Stock"]; break;
无数据返回的排查方向
当你用{ sku: "RVR-8-F" }返回200但无数据时,按以下步骤排查:
- 确认
sku值完全匹配表中数据(DynamoDB对字符串大小写、特殊字符敏感) - 检查表是否定义了排序键(范围键):如果表有排序键,Keys数组中的每个对象必须同时包含分区键和排序键,否则无法匹配记录
- 全局二级索引(GSI)不需要包含在Keys里,BatchGetCommand仅支持通过主键(分区键+排序键)获取数据
额外注意事项
- BatchGetCommand的返回结构和GetCommand/ScanCommand不同:成功获取的数据在
response.Responses[表名]中,你之前的body = body.Items会导致拿到undefined,这也是你误以为无数据的可能原因之一 - 单批次最多请求100条记录,超过需分页处理
内容的提问来源于stack exchange,提问作者Chris Allinson
相关产品推荐
相关产品推荐

