Node.js(AWS SDK v3)中的 DynamoDB GetItem
AWS SDK v3 给了你两种读取单个项目的方式:DynamoDBClient 上的 GetItemCommand,它说的是线上格式({S: '...'});或者 DynamoDBDocumentClient 上的 GetCommand,它收发普通的 JavaScript。
示例用的是低层 client。那些包装正是属性值编码在线上真实的样子,也是错误消息回敬给你的东西。无论走哪条路,请求都需要完整主键。
代码
import {DynamoDBClient, GetItemCommand} from '@aws-sdk/client-dynamodb';
const client = new DynamoDBClient({region: 'us-east-1'});
const command = new GetItemCommand({
TableName: 'Music',
Key: {
Artist: {S: 'Arturo Sandoval'},
SongTitle: {S: 'Cubano Chant'}
},
ProjectionExpression: '#proj0, #proj1, #proj2, #proj3',
ExpressionAttributeNames: {
'#proj0': 'Artist',
'#proj1': 'SongTitle',
'#proj2': 'AlbumTitle',
'#proj3': 'Year'
}
});
const response = await client.send(command);
if (!response.Item) {
console.log('Item not found');
} else {
console.log(response.Item);
}说明
- 是
send(command),不是client.getItem()——DynamoDBClient只暴露send。同一个包里聚合的DynamoDB类确实带有getItem方法,如果你想要 SDK v2 风格的调用可以用它,代价是把每一个 command 都拉进你的打包产物。 - 没命中是
undefined,不是错误——response.Item只是不存在,而调用照样 resolve。response.$metadata总是会来,所以对响应本身判真假什么也说明不了。 unmarshall按数量级挑数字类型——安全整数范围内的{N: …}回来是number,范围之外是BigInt,而一个很大的非整数会抛出can't be converted to BigInt。给@aws-sdk/util-dynamodb的unmarshall传{wrapNumbers: true},每个数字就都以NumberValue的形式到达,转换由你决定。- 那些
#proj别名是有承重作用的——Year在 AWS 的保留字清单上,所以直接写出它的ProjectionExpression会被拒绝。像上面那样给每个名字都起别名,是安全的默认做法。它裁剪的是响应,不是读取成本(原因)。 ConsumedCapacity是要主动开启的——加上ReturnConsumedCapacity: 'TOTAL',响应就会报告这次读取实际花了多少:一个 4 KB 以内的项目做最终一致性读取是 0.5 个容量单元,加上ConsistentRead: true之后是 1.0(这个取舍)。- 把 client 提到外面——在模块作用域构造一次
DynamoDBClient。每个请求建一个,或者在 Lambda 处理函数内部建,等于每次调用都把连接池和已解析的凭证扔掉。
用可视化的方式来做
DynoTable 把项目显示成普通的行,而不是属性值映射,并且能把网格背后的查询导出成一个可运行的 SDK v3 程序。下载 DynoTable。
相关指南
- Query 与 Scan 的对比——什么时候一次
GetItem胜过Query。 - DynamoDB 分区键是怎么工作的——为什么
GetItem需要完整的键。 - DynamoDB ResourceNotFoundException——这里通常遇到的第一个错误:表名或区域写错了。
- "The provided key element does not match the schema"——你传的键与表的键模式不匹配。
参考资料
- GetItem — Amazon DynamoDB API Reference
- GetItemCommand — AWS SDK for JavaScript v3 Reference
- Read consistency — Amazon DynamoDB Developer Guide
- Capacity unit consumption — Amazon DynamoDB Developer Guide
- @aws-sdk/lib-dynamodb — large numbers and
NumberValue
最后核实于 2026-07-28,依据上方链接的 AWS 官方文档。