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 update

Terhadap 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. UpdateItemCommand memvalidasi bentuk objek input, tak pernah tata bahasa di dalam UpdateExpression, jadi salah ketik berarti satu round trip dan sebuah 400. Tata bahasanya ada di update expression; ADD #upd2 :updValue2 adalah penambahan atomiknya, dan menambahkan ConditionExpression: '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_NEW mengirim seluruh item kembali pada tiap panggilan, yang pada item gemuk berarti bandwidth yang Anda bayar demi membaca satu counter.

  • $metadata adalah kanal di luar jalur milik v3: {"httpStatusCode":200,"requestId":"...","attempts":1,"totalRetryDelay":0}. attempts adalah jawaban jujur atas "apakah ini dicoba ulang", yang penting ketika Anda menalar apakah sebuah penulisan non-idempoten berjalan dua kali.

  • ValidationException bukan kelas yang bisa Anda catch, hanya sebuah name yang bisa Anda bandingkan. Alias yang hilang kembali sebagai err.name === 'ValidationException' dengan err.message berisi Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: Year.

  • Document client adalah pertukaran yang lain. @aws-sdk/lib-dynamodb menerima nilai JS native dan meng-unmarshal responsnya, dengan mengorbankan keamanan string tadi. marshall({awards: 9007199254740993}) dari @aws-sdk/util-dynamodb menolak 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, bukan 3 yang 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

Referensi

Terakhir diverifikasi 2026-07-28 terhadap dokumentasi resmi AWS yang ditautkan di atas.

Bekerja dengan DynamoDB tanpa Console

Klien desktop DynamoDB yang cepat dan menjalankan SQL sungguhan yang tidak bisa dijalankan DynamoDB — JOINs, GROUP BY, agregasi — dengan editing visual dan agen AI pada kunci Bedrock milik Anda sendiri.

Uji coba gratis 30 hari, tanpa kartu kredit — lalu paket Free tanpa batas waktu.