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-dynamodbunmarshall{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

相关指南

参考资料

最后核实于 2026-07-28,依据上方链接的 AWS 官方文档。

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。