The provided starting key is invalid

TL;DR — 你的 ExclusiveStartKey 不符合你正在分頁的對象的 key schema。它必須確切含有 DynamoDB 在 LastEvaluatedKey 中回傳的鍵屬性 — 完整的 primary key,加上當你查詢 GSI/LSI 時的索引鍵 — 名稱與型別相同。原封不動地傳回 LastEvaluatedKey;手工組裝它正是這出錯之處。

這是什麼意思

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

ExclusiveStartKey 告訴 Query/Scan 從哪裡繼續。DynamoDB 對照表格的 key schema — 或對索引查詢而言,LastEvaluatedKey 攜帶的索引加表格的組合鍵 — 驗證它。缺少屬性、多餘屬性、名稱錯誤或型別錯誤,都會在讀取任何資料前失敗。

為什麼會發生

  • 只用 partition key 手工組建鍵 — 複合鍵表格的起始鍵需要 partition sort key。
  • 只用表格鍵分頁索引 — GSI/LSI 查詢上的 LastEvaluatedKey 含有索引鍵屬性與表格的 primary key;它們全都必須傳回。
  • 型別或名稱偏移 — 鍵被序列化(JSON、URL 參數、快取)並在 LastEvaluatedKey 原為數字之處以 "42" 傳回,或以改名的欄位傳回。
  • 跨查詢重用鍵 — 將某個表格/索引的 LastEvaluatedKey 傳給對另一個的查詢,或在 key schema 假設改變後傳給同一個查詢。
  • 包裝器注入預設值 — 一個填入它認為屬於鍵的屬性的 ODM,可能將起始鍵填充超過 schema 大小。

如何修正

  1. 原封不動地來回傳遞 LastEvaluatedKey

    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. 若它跨越請求邊界,無損地序列化它 — 當分頁游標送到瀏覽器再返回時,編碼整個 LastEvaluatedKey 物件(例如其 JSON 的 base64),而非從項目欄位重建它,並保持數字型別為數字。

  3. 索引分頁時包含每個鍵屬性 — 索引 partition/sort key 表格 partition/sort key,確切如回傳。

  4. 不要捏造起始點 — DynamoDB 分頁沒有 offset;若你需要「從 X 附近開始」,在 KeyConditionExpression 中表達它(sk > :x),而非手工製作的 ExclusiveStartKey

檢視 LastEvaluatedKey 對你的表格或索引實際含有什麼,可省去猜測 — DynoTable 桌面應用程式分頁瀏覽查詢並顯示原始游標,而 DynamoDB Expression Builder 圍繞它組合查詢請求。

相關錯誤

References

最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件。

不必透過主控台就能操作 DynamoDB

DynoTable 是一款快速的 DynamoDB 桌面用戶端 — 瀏覽表格、執行 SQL 風格的查詢,並在本機編輯項目。