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 updateGenre'ı 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.
UpdateItemCommandgirdi nesnesinin biçimini doğrular,UpdateExpressioniç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 :updValue2atomik artırımdır veConditionExpression: '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_NEWher ç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.$metadatav3'ü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.ValidationExceptionyakalayabileceğiniz bir sınıf değildir, yalnızca karşılaştırabileceğiniz birname'dir. Eksik bir takma ad,err.messageInvalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: Yearolarak ayarlanmış hâldeerr.name === 'ValidationException'biçiminde geri gelir.Belge istemcisi diğer takastır.
@aws-sdk/lib-dynamodbyerel JS değerlerini alır ve yanıtı unmarshal eder — o dize güvenliği pahasına.@aws-sdk/util-dynamodb'dekimarshall({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
3ile değil,2ile 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
- DynamoDB güncelleme ifadeleri —
SET,ADD,REMOVE,DELETEve idiyomlar. - ReturnValues'ı anlamak — her
ReturnValuesseçeneğinin size ne verdiği. - "Attribute name is a reserved keyword" — buradaki takma ad eşlemesi neden isteğe bağlı değil.
- "Invalid UpdateExpression" söz dizimi hataları — yaygın SET/ADD söz dizimi hataları, çözülmüş hâliyle.
Kaynaklar
- UpdateItem — Amazon DynamoDB API Reference
- UpdateItemCommand — AWS SDK for JavaScript v3 Reference
- Update expressions — Amazon DynamoDB Developer Guide
En son 2026-07-28 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.