ValidationException: ExpressionAttributeValues contains invalid value

TL;DR — ExpressionAttributeValues'teki bir değer boş, desteklenmeyen bir türde ya da ifadenizde kullanılan bir :placeholder hiç tanımlanmadı. Her :value'nin var olduğunu ve boş olmadığını kontrol edin.

Ne anlama gelir

Yaygın mesajlar:

ValidationException: ExpressionAttributeValues contains invalid value: One or more parameter values were invalid: An AttributeValue may not contain an empty string for key :s
ValidationException: Value provided in ExpressionAttributeValues unused in expressions: keys: {:x}
ValidationException: An expression attribute value used in expression is not defined; attribute value: :v

Neden olur

  • Boş string / boş ikili — tarihsel olarak DynamoDB ""'yi reddederdi. Boş stringlere artık anahtar olmayan öznitelikler için izin veriliyor (ve boş Listeler/Map'ler sorunsuzdur), ancak anahtar özniteliklerdeki boş değerler ve boş Kümeler hâlâ geçersizdir.
  • Tanımsız yer tutucu — ifadeniz :v'ye başvuruyor ama ExpressionAttributeValues'te :v yok.
  • Kullanılmayan yer tutucu:x tanımladınız ama hiçbir ifade onu kullanmıyor (DynamoDB tüm isteği reddeder).
  • Yanlış tür — çıplak bir JS nesnesi/undefined/NaN ya da (düşük seviyeli istemciyle) yanlış {S}/{N} sarmalayıcısı geçirmek.
  • Bir ADD/DELETE işlemine geçirilen boş bir küme — o cümleler küme (ya da ADD için sayı) işlenenleri alır ve bir küme asla boş olamaz.

Nasıl düzeltilir

  1. İfadedeki her :value, ExpressionAttributeValues'te tanımlanmalıdır ve tanımlanan her değer kullanılmalıdır — ikisini tam olarak eşzamanlı tutun.
  2. Boş/undefined'a karşı koruyun. Kaynak undefined olduğunda :v geçirmeyin; bunun yerine cümleyi bırakın. Kümeler için en az bir üye olduğundan emin olun.
  3. Yerel JS değerlerinin senin için marshal edilmesi için Document Client'ı (@aws-sdk/lib-dynamodb) kullanın — çoğu tür sarmalayıcı hatasını kaldırır.

Örnek

import {DynamoDBClient} from '@aws-sdk/client-dynamodb';
import {DynamoDBDocumentClient, UpdateCommand} from '@aws-sdk/lib-dynamodb';

const doc = DynamoDBDocumentClient.from(new DynamoDBClient({}));

const email = getEmail(); // could be undefined
const names = {'#e': 'email'};
const values = {':e': email};

if (email == null) throw new Error('email required'); // don't send :e = undefined

await doc.send(
  new UpdateCommand({
    TableName: 'Users',
    Key: {pk: 'USER#1'},
    UpdateExpression: 'SET #e = :e',
    ExpressionAttributeNames: names,
    ExpressionAttributeValues: values
  })
);

DynoTable yolu

DynoTable'un güncelleme düzenleyicisi sen yazarken değerleri bağlar ve istek makinenizden ayrılmadan önce boş yer tutucuları reddeder. Öğeyi ⌘K ile açın, bir alanı düzenleyin ve oluşturulan ExpressionAttributeValues haritasını istek önizlemesinde inceleyin; uyumsuzluklar CloudWatch'ta 400 yerine hemen görünür.

Satır içi çalıştıramayacağınız SDK kodu için ifadeyi Expression Builder'ye yapıştırın ve :value haritasını kendi haritanızla karşılaştırın. Hatayı oluşturan aynı tabloyu test etmek için profilleri ⌘P ile değiştirin; Ayarlar → Profiller'deki Bağlantıyı Test Et, kimlik bilgilerini ve bölgeyi doğrular. Kurulum: Connect to AWS, Install. Boş kümeler ve tanımlanmamış JS değerleri en yaygın nedenlerdir; çağrı işleminizden ayrılmadan önce her ikisini de koruyun.

Kaynaklar

İlgili hatalar

Kaynaklar

En son 2026-07-13 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.