首页 > 解决方案 > 无法在 DynamoDB DocumentClient 中实现分页

问题描述

我正在为一个项目使用 React/DynamoDB 堆栈。我正在尝试使用scanDynamoDB DocumentClient 中的方法进行分页。这是我正在使用的功能:

async function getItems(lastItem?) {
  try {
    const params = {
      TableName: "posts",
      Limit: 1,
    };
    if (lastItem) {
      params.ExclusiveStartKey = { item_id: lastItem };
    }
    const response = await docClient.scan(params).promise();
    console.log(response)
    return {
      items: response.Items,
      lastItem: response.LastEvaluatedKey,
    };
  } catch (error) {
    throw error;
  }
}

我将此组件用于console.log此响应:

import { getItems } from "../../atoms/functions/AWS";

function Test() {
  return (
    <div>
      <button onClick={() => getItems()}>get item</button>
    </div>
  );
}

但是,每次点击我都会得到相同的结果:

Object { Items: (1) […], Count: 1, ScannedCount: 1, LastEvaluatedKey: {…}, … }
"$response": Object { retryCount: 0, redirectCount: 0, maxRetries: 10, … }
​Count: 1
​Items: Array [ {…} ]
​LastEvaluatedKey: Object { postId: "2" }
ScannedCount: 1

我正在使用一个带有 5 个帖子的模拟 DynamoDB 表 - postId: "1"postId: "2"等。

我是否getItems错误地实现了该功能?如何修改上述代码以对所有帖子进行分页?

编辑:

我根据 Mark B 的建议更新了我的组件:

function Test() {
  const [item, setItem] = useState();

  useEffect(() => {
    getItems().then((resp) => setItem(resp));
  }, []);

  return (
    <div>
      <button onClick={() => getItems(item)}>get item</button>
    </div>
  );
}

并替换return {items: response.Items, lastItem: response.LastEvaluatedKey};return response.LastEvaluatedKey;.

我认为这最终会奏效。但是,我收到以下错误:

Uncaught (in promise) ValidationException: The provided starting key is invalid: The provided key element does not match the schema

标签: javascriptreactjsamazon-web-servicespaginationamazon-dynamodb

解决方案


推荐阅读