DynamoDB UpdateItem di Node.js (AWS SDK v3)
Client v3 tingkat rendah berbicara DynamoDB JSON di kedua arah, artinya setiap angka yang Anda kirim dan setiap angka yang Anda terima kembali adalah sebuah string. Itu bukan cacat; itu satu-satunya cara sebuah angka DynamoDB 38 digit selamat di bahasa yang satu-satunya tipe angkanya adalah double. Di situ pula letak bug-bugnya.
Kode
import {DynamoDBClient, UpdateItemCommand} from '@aws-sdk/client-dynamodb';
const client = new DynamoDBClient({region: 'us-east-1'});
const command = new UpdateItemCommand({
TableName: 'Music',
Key: {
Artist: {S: 'Arturo Sandoval'},
SongTitle: {S: 'Cubano Chant'}
},
UpdateExpression: 'SET #upd0 = :updValue0, #upd1 = :updValue1 ADD #upd2 :updValue2',
ExpressionAttributeNames: {
'#upd0': 'Genre',
'#upd1': 'Year',
'#upd2': 'Awards'
},
ExpressionAttributeValues: {
':updValue0': {S: 'Latin Jazz'},
':updValue1': {N: '1994'},
':updValue2': {N: '1'}
},
ReturnValues: 'ALL_NEW'
});
const response = await client.send(command);
console.log(response.Attributes); // the item after the updateTerhadap item yang tidak punya Genre dan tidak punya Awards, response.Attributes kembali sebagai:
{"Artist":{"S":"Arturo Sandoval"},"Awards":{"N":"1"},"Genre":{"S":"Latin Jazz"},"Year":{"N":"1994"},"SongTitle":{"S":"Cubano Chant"}}typeof response.Attributes.Awards.N adalah "string", jadi response.Attributes.Awards.N + 1 menghasilkan "11". Tak ada yang melempar error, tak ada yang memperingatkan, dan angka yang salah masuk ke penulisan Anda berikutnya. Lakukan parsing di batas: Number(response.Attributes.Awards.N).
Penjelasan
Expression-nya adalah string biasa, dan v3 tidak akan memeriksanya.
UpdateItemCommandmemvalidasi bentuk objek input, tak pernah tata bahasa di dalamUpdateExpression, jadi salah ketik berarti satu round trip dan sebuah 400. Tata bahasanya ada di update expression;ADD #upd2 :updValue2adalah penambahan atomiknya, dan menambahkanConditionExpression: 'attribute_exists(Artist)'membuat panggilannya hanya-update alih-alih upsert.ReturnValues: 'UPDATED_NEW'biasanya yang Anda inginkan. Update yang sama mengembalikan{"Awards":{"N":"2"}}dan tidak lebih.ALL_NEWmengirim seluruh item kembali pada tiap panggilan, yang pada item gemuk berarti bandwidth yang Anda bayar demi membaca satu counter.$metadataadalah kanal di luar jalur milik v3:{"httpStatusCode":200,"requestId":"...","attempts":1,"totalRetryDelay":0}.attemptsadalah jawaban jujur atas "apakah ini dicoba ulang", yang penting ketika Anda menalar apakah sebuah penulisan non-idempoten berjalan dua kali.ValidationExceptionbukan kelas yang bisa Anda catch, hanya sebuahnameyang bisa Anda bandingkan. Alias yang hilang kembali sebagaierr.name === 'ValidationException'denganerr.messageberisiInvalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: Year.Document client adalah pertukaran yang lain.
@aws-sdk/lib-dynamodbmenerima nilai JS native dan meng-unmarshal responsnya, dengan mengorbankan keamanan string tadi.marshall({awards: 9007199254740993})dari@aws-sdk/util-dynamodbmenolak mentah-mentah:Number 9007199254740992 is greater than Number.MAX_SAFE_INTEGER. Use NumberValue from @aws-sdk/lib-dynamodb.Perhatikan baik-baik angka di pesan itu. Ia berakhir dengan
2, bukan3yang tertulis di literalnya: JavaScript sudah membulatkannya sebelum SDK sempat melihatnya. Client tingkat rendah di potongan kode ini tak mungkin mengalami masalah itu, karena{N: '9007199254740993'}adalah teks sepanjang jalan sampai ke jalur transport.
Apa yang diberikan kondisi yang gagal
Tambahkan ReturnValuesOnConditionCheckFailure: 'ALL_OLD' ke input dan error yang dilempar membawa item yang mendahului Anda:
name: ConditionalCheckFailedException | message: "The conditional request failed" | http: 400
err.Item: {"Artist":{"S":"Arturo Sandoval"},"Awards":{"N":"2"},"Year":{"N":"1994"},"SongTitle":{"S":"Cubano Chant"},"Genre":{"S":"Latin Jazz"}}err.Item adalah DynamoDB JSON mentah terlepas dari client mana yang melemparnya, dan ia gratis. Tanpa itu, cara jujur untuk mengetahui mengapa sebuah update optimistic-concurrency gagal adalah GetItem susulan yang menghabiskan satu pembacaan dan mungkin sudah basi lagi.
Konverter DynamoDB JSON mengubah payload itu menjadi objek JS biasa dan sebaliknya, yang merupakan cara tercepat membangun fixture dari item sungguhan. Untuk menarik item itu dari tabel live sejak awal, unduh DynoTable.
Panduan terkait
- Update expression DynamoDB —
SET,ADD,REMOVE,DELETE, dan idiomnya. - Memahami ReturnValues — apa yang diberikan tiap opsi
ReturnValues. - "Attribute name is a reserved keyword" — mengapa peta alias di sini tidak opsional.
- Error sintaks "Invalid UpdateExpression" — kesalahan sintaks SET/ADD yang umum, diuraikan.
Referensi
- UpdateItem — Amazon DynamoDB API Reference
- UpdateItemCommand — AWS SDK for JavaScript v3 Reference
- Update expressions — Amazon DynamoDB Developer Guide
Terakhir diverifikasi 2026-07-28 terhadap dokumentasi resmi AWS yang ditautkan di atas.