DynamoDB GetItem en Node.js (AWS SDK v3)
AWS SDK v3 te da dos formas de leer un elemento: GetItemCommand sobre un DynamoDBClient, que habla el formato de red ({S: '...'}), o GetCommand sobre un DynamoDBDocumentClient, que acepta y devuelve JavaScript plano.
El ejemplo usa el cliente de bajo nivel. Esos envoltorios son el aspecto real de la codificación de valores de atributo en la red, y lo que los mensajes de error te citan de vuelta. En cualquiera de los dos casos la petición necesita la clave principal completa.
Código
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);
}Explicación
send(command), noclient.getItem()—DynamoDBClientsolo exponesend. La clase agregadaDynamoDBdel mismo paquete sí tiene un métodogetItemsi quieres llamadas al estilo del SDK v2, al precio de arrastrar todos los comandos a tu bundle.- Un fallo es
undefined, no un error —response.Itemsimplemente no está, y la llamada se resuelve igual.response.$metadatallega siempre, así que la veracidad de la respuesta en sí no te dice nada. unmarshallelige el tipo numérico según la magnitud — un{N: …}dentro del rango de enteros seguros vuelve comonumber, cualquier cosa fuera de él comoBigInt, y un no entero grande lanzacan't be converted to BigInt. Pasa{wrapNumbers: true}aunmarshallde@aws-sdk/util-dynamodby cada número llega como unNumberValue, de modo que la conversión la decides tú.- Los alias
#projson imprescindibles —Yearestá en la lista de palabras reservadas de AWS, así que unaProjectionExpressionque lo nombre directamente es rechazada. Poner alias a todos los nombres, como arriba, es lo seguro por defecto. Recorta la respuesta, no el coste de la lectura (por qué). ConsumedCapacityes opcional — añadeReturnConsumedCapacity: 'TOTAL'y la respuesta informa de lo que realmente costó esta lectura: 0,5 unidades de capacidad para una lectura eventualmente consistente de un elemento de menos de 4 KB, 1,0 en cuanto añadesConsistentRead: true(el compromiso).- Saca el cliente fuera — construye
DynamoDBClientuna sola vez a nivel de módulo. Crear uno por petición, o dentro de un handler de Lambda, tira a la basura el pool de conexiones y las credenciales resueltas en cada llamada.
Hazlo visualmente
DynoTable muestra los elementos como filas normales en lugar de mapas de valores de atributo, y exporta la consulta que hay detrás de la cuadrícula como un programa ejecutable del SDK v3. Descarga DynoTable.
Guías relacionadas
- Query frente a Scan — cuándo un solo
GetItemgana a unQuery. - Cómo funcionan las claves de partición de DynamoDB — por qué
GetItemnecesita la clave completa. - DynamoDB ResourceNotFoundException — el primer error habitual aquí: nombre de tabla o región equivocados.
- "The provided key element does not match the schema" — la clave que pasas no coincide con el esquema de clave de la tabla.
Referencias
- 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
Verificado por última vez el 2026-07-28 contra la documentación oficial de AWS enlazada arriba.