Node.js'te DynamoDB UpdateItem (AWS SDK v3)

Düşük seviyeli v3 istemcisi her iki yönde de DynamoDB JSON konuşur; bu da gönderdiğiniz her sayının ve geri aldığınız her sayının bir dize olduğu anlamına gelir. Bu bir kusur değildir; 38 haneli bir DynamoDB sayısının, tek sayı türü double olan bir dilden sağ çıkmasının tek yolu budur. Aynı zamanda hataların bulunduğu yerdir.

Kod

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

Genre'ı ve Awards'ı olmayan bir öğeye karşı response.Attributes şöyle geri gelir:

{"Artist":{"S":"Arturo Sandoval"},"Awards":{"N":"1"},"Genre":{"S":"Latin Jazz"},"Year":{"N":"1994"},"SongTitle":{"S":"Cubano Chant"}}

typeof response.Attributes.Awards.N "string"'dir; dolayısıyla response.Attributes.Awards.N + 1 "11" olarak değerlendirilir. Hiçbir şey hata fırlatmaz, hiçbir şey uyarmaz ve yanlış sayı bir sonraki yazmanıza girer. Sınırda ayrıştırın: Number(response.Attributes.Awards.N).

Açıklama

  • İfade düz bir dizedir ve v3 onu denetlemez. UpdateItemCommand girdi nesnesinin biçimini doğrular, UpdateExpression içindeki grameri asla; dolayısıyla bir yazım hatası bir gidiş-dönüş ve bir 400 demektir. Gramer güncelleme ifadeleri sayfasındadır; ADD #upd2 :updValue2 atomik artırımdır ve ConditionExpression: 'attribute_exists(Artist)' eklemek çağrıyı bir upsert yerine yalnızca-güncelleme hâline getirir.

  • ReturnValues: 'UPDATED_NEW' genellikle istediğinizdir. Aynı güncelleme {"Awards":{"N":"2"}} döndürür, başka bir şey döndürmez. ALL_NEW her çağrıda öğenin tamamını geri gönderir; şişman bir öğede bu, tek bir sayacı okumak için ödediğiniz bant genişliğidir.

  • $metadata v3'ün bant dışı kanalıdır: {"httpStatusCode":200,"requestId":"...","attempts":1,"totalRetryDelay":0}. attempts, "bu yeniden denendi mi" sorusunun dürüst yanıtıdır — ki idempotent olmayan bir yazmanın iki kez çalışıp çalışmadığını düşünürken bu önemlidir.

  • ValidationException yakalayabileceğiniz bir sınıf değildir, yalnızca karşılaştırabileceğiniz bir name'dir. Eksik bir takma ad, err.message Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: Year olarak ayarlanmış hâlde err.name === 'ValidationException' biçiminde geri gelir.

  • Belge istemcisi diğer takastır. @aws-sdk/lib-dynamodb yerel JS değerlerini alır ve yanıtı unmarshal eder — o dize güvenliği pahasına. @aws-sdk/util-dynamodb'deki marshall({awards: 9007199254740993}) doğrudan reddeder:

    Number 9007199254740992 is greater than Number.MAX_SAFE_INTEGER. Use NumberValue from @aws-sdk/lib-dynamodb.

    O mesajdaki sayıya dikkatle bakın. Değişmezde yazılan 3 ile değil, 2 ile bitiyor: JavaScript, SDK onu görmeden önce zaten yuvarlamıştı. Bu parçacıktaki düşük seviyeli istemcinin böyle bir sorunu olamaz, çünkü {N: '9007199254740993'} hatta çıkana kadar metindir.

Başarısız bir koşul size ne verir

Girdiye ReturnValuesOnConditionCheckFailure: 'ALL_OLD' ekleyin; fırlatılan hata sizi geçen öğeyi taşır:

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, onu hangi istemci fırlatmış olursa olsun ham DynamoDB JSON'udur ve bedavadır. O olmadan, iyimser eşzamanlılık güncellemesinin neden başarısız olduğunu öğrenmenin dürüst yolu, bir okumaya mal olan ve çoktan yine bayatlamış olabilecek bir takip GetItem'ıdır.

DynamoDB JSON dönüştürücü, o yükü düz bir JS nesnesine ve geri çevirir — ki bu, gerçek bir öğeden düzenek kurmanın en hızlı yoludur. O öğeyi en başta canlı bir tablodan çekmek için DynoTable'ı indirin.

İlgili kılavuzlar

Kaynaklar

En son 2026-07-28 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

Console olmadan DynamoDB ile çalış

DynamoDB’nin çalıştıramadığı gerçek SQL’i çalıştıran hızlı bir DynamoDB masaüstü istemcisi — JOINs, GROUP BY, toplamalar — görsel düzenleme ve kendi Bedrock anahtarların üzerinde bir yapay zekâ aracısıyla.

30 günlük ücretsiz deneme, kredi kartı yok — ardından süre sınırı olmayan Ücretsiz plan.