You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS DynamoDB分页跳转异常:指定页码切换报起始键无效错误

问题排查与解决方案

一、先修正代码里的基础语法错误

  • 表名字符串未闭合:TableName: "tablename, 改为 TableName: "tablename",
  • 表达式属性值引用错误::keyValue 绑定了Date对象,应该用定义好的currentDate变量
  • 客户端对象混用:代码开头用v2 SDK的require('aws-sdk')初始化dynamoDb,但后续用了v3 SDK的docClient.send(new QueryCommand(params))写法,需统一SDK版本

二、核心问题:DynamoDB不支持基于offset的页码跳转

你用offset构造ExclusiveStartKey的思路完全错误,DynamoDB采用游标式分页,ExclusiveStartKey必须是上一页查询结果中最后一条数据的完整索引键(或主键),不能通过页码计算offset生成。针对你100条数据的场景,提供两种可行方案:

方案1:小数据量下直接迭代到目标页码

总数据仅100条,每页10条共10页,直接从第一页开始查询,跳过前面的页码直到拿到目标页数据:

const { DynamoDBClient, QueryCommand } = require("@aws-sdk/client-dynamodb");
const { DynamoDBDocumentClient } = require("@aws-sdk/lib-dynamodb");
const moment = require('moment');

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

async function getTargetPage(targetPage = 1, pageSize = 10) {
    const currentDate = moment().format('YYYY-MM-DD');
    const code = "19";
    let exclusiveStartKey = undefined;
    let result = null;

    // 迭代跳过前面的页码
    for (let i = 1; i <= targetPage; i++) {
        const params = {
            TableName: "tablename",
            IndexName: "indexname",
            KeyConditionExpression: "code = :num AND #date = :keyValue",
            ExpressionAttributeNames: { "#date": "Date" }, // 规避Date为保留字的问题
            ExpressionAttributeValues: {
                ":num": code,
                ":keyValue": currentDate
            },
            Limit: pageSize,
            ExclusiveStartKey: exclusiveStartKey
        };

        result = await docClient.send(new QueryCommand(params));
        // 更新游标为当前页最后一条数据的键
        exclusiveStartKey = result.LastEvaluatedKey;
        // 已到最后一页则直接跳出
        if (!exclusiveStartKey) break;
    }

    return result;
}

// 示例:获取第5页数据
getTargetPage(5).then(output => {
    console.log(output);
    // return API.ok(output);
});

方案2:预存各页码的起始游标(适合大数据量场景)

如果数据量极大,迭代到目标页效率低下,可以预先把每个页码对应的LastEvaluatedKey存储到另一个表中,跳转时直接读取对应页码的游标作为ExclusiveStartKey发起查询。

三、原错误原因总结

你构造的ExclusiveStartKey只是索引分区键和排序键的固定值,并非某条具体数据的完整键,DynamoDB无法识别这个起始位置,因此抛出The provided starting key is invalid错误。只有当ExclusiveStartKey完全匹配查询结果中某一条数据的索引键时,才能作为有效的起始游标。

内容的提问来源于stack exchange,提问作者user0999

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:07:10