The provided starting key is invalid

TL;DR — ExclusiveStartKey'iniz, sayfaladığınız şeyin anahtar şemasıyla eşleşmiyor. DynamoDB'nin LastEvaluatedKey'de döndürdüğü tam anahtar özniteliklerini — tam birincil anahtarı, artı bir GSI/LSI sorguladığınızda indeks anahtarını — aynı adlar ve türlerle içermelidir. LastEvaluatedKey'i birebir geri iletin; onu elle birleştirmek bunun bozulma şeklidir.

Ne anlama gelir

ValidationException: The provided starting key is invalid
ValidationException: Exclusive Start Key must have same size as table's key schema

ExclusiveStartKey, bir Query/Scan'e nereden devam edeceğini söyler. DynamoDB onu tablonun anahtar şemasına — ya da bir indeks sorgusu için, LastEvaluatedKey'in taşıdığı birleşik indeks-artı-tablo anahtarına — karşı doğrular. Eksik öznitelikler, fazladan öznitelikler, yanlış adlar ya da yanlış türler, herhangi bir veri okunmadan önce başarısız olur.

Neden olur

  • Anahtarı yalnızca bölüm anahtarıyla elle oluşturmak — bileşik anahtarlı bir tablo, başlangıç anahtarında bölüm ve sıralama anahtarına ihtiyaç duyar.
  • Bir indeksi yalnızca tablo anahtarıyla sayfalamak — bir GSI/LSI sorgusundaki LastEvaluatedKey, hem indeks anahtar özniteliklerini hem de tablonun birincil anahtarını içerir; hepsi geri gelmelidir.
  • Tür veya ad kayması — anahtar serileştirildi (JSON, URL parametresi, önbellek) ve LastEvaluatedKey'in bir sayısı olduğu yerde "42" ile ya da yeniden adlandırılmış bir alanla geri geldi.
  • Bir anahtarı sorgular arasında yeniden kullanmak — bir tablodan/indeksten gelen bir LastEvaluatedKey'i başka birine karşı bir sorguya ya da anahtar şeması varsayımı değiştikten sonra aynı sorguya iletmek.
  • Varsayılan enjekte eden bir sarmalayıcı — anahtara ait olduğunu düşündüğü öznitelikleri dolduran bir ODM, başlangıç anahtarını şema boyutunun ötesinde doldurabilir.

Nasıl düzeltilir

  1. LastEvaluatedKey'i dokunmadan gidip-getirin:

    let ExclusiveStartKey;
    do {
      const page = await docClient.send(
        new QueryCommand({
          TableName,
          KeyConditionExpression,
          ExpressionAttributeValues,
          ExclusiveStartKey
        })
      );
      items.push(...(page.Items ?? []));
      ExclusiveStartKey = page.LastEvaluatedKey; // verbatim — no rebuild
    } while (ExclusiveStartKey);
  2. Bir istek sınırını geçiyorsa onu kayıpsız serileştirin — sayfalama imleci bir tarayıcıya gidip döndüğünde, onu öğe alanlarından yeniden oluşturmak yerine tüm LastEvaluatedKey nesnesini kodlayın (örneğin JSON'unun base64'ü) ve sayı türlerini sayı tutun.

  3. İndeks sayfalaması için her anahtar özniteliğini dahil edin — indeks bölüm/sıralama anahtarı ve tablo bölüm/sıralama anahtarı, tam olarak döndürüldüğü gibi.

  4. Bir başlangıç noktası uydurmayın — DynamoDB sayfalamasının ofseti yoktur; "X'e yakın başla" gerekiyorsa, onu elle yapılmış bir ExclusiveStartKey yerine KeyConditionExpression'da (sk > :x) ifade edin.

LastEvaluatedKey'in tablonuz ya da indeksiniz için gerçekte ne içerdiğini incelemek tahmin işini ortadan kaldırır — DynoTable masaüstü uygulaması sorgular arasında sayfalar ve çıplak imleci gösterir ve DynamoDB Expression Builder sorgu isteğini onun etrafında oluşturur.

İlgili hatalar

References

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

Console olmadan DynamoDB ile çalışın

DynoTable, DynamoDB için hızlı bir masaüstü istemcisidir — tablolara göz atın, SQL tarzı sorgular çalıştırın ve item'ları yerel olarak düzenleyin.