ValidationException:table 没有指定的索引:GameTitleIndex

ValidationException: The table does not have the specified index: GameTitleIndex

我正在使用 Vogels,用于 NodeJS 的 DynamoDB 数据映射器。根据 Vogels 的文档,我正在查询 全局索引 。我所做的就是创建一个具有全局二级索引的模型,如下所示:

let MyModel = vogels.define('MyModel', {
  hashKey: 'uuid',
  timestamps: true,
  updatedAt: 'updated_at',
  createdAt: 'created_at',
  schema: MyModelBaseSchema,
  indexes : [{ 
    hashKey : 'gameTitle', rangeKey : 'topScore', name : 'GameTitleIndex', type : 'global'
  }]
});

并查询该索引

MyModel.query('game 1')
  .usingIndex('GameTitleIndex')
  .loadAll()
  .select("COUNT");

当 运行 任何测试显示异常时 ValidationException: The table does not have the specified index: GameTitleIndex

根据文档,这就是我获取数据所需要做的全部工作。查询这个索引有什么我遗漏的吗? 任何答案将不胜感激。 提前致谢。

如果有人遇到同样的问题,答案如下: 在模型中创建新索引(本地二级索引或全局二级索引)后,迁移次数为 运行。只有在那之后 table 才会有指定的索引。有关更多说明,请参阅 this issue

– 如果您使用带有 serverless-dynamodb-localserverless-offline 插件的无服务器框架(用于本地测试).

– 如果您创建了新的 Local Secondary Index,但下面显示的命令仍然没有在 LocalSecondaryIndexes 配置节点下显示它:

aws dynamodb describe-table --table-name YOUT_TABLE_NAME --endpoint-url http://localhost:8000

– 如果您在使用类似于如下所示的代码时收到错误 ValidationException: The table does not have the specified index: YOUR_INDEX_NAME

  query(uid, id) {
    const params = {
      TableName: YOUR_TABLE_NAME,
      IndexName: YOUR_LSI_NAME,
      KeyConditionExpression: "#uid = :uid and #id = :id",
      ExpressionAttributeNames: {
        "#uid": "uid",
        "#id": "id",
      },
      ExpressionAttributeValues: { ":uid": uid, ":id": id },
    };
    return DB.query(params).promise();
  }

那么您很可能需要 删除 本地 DynamoDB 数据库文件并使用 serverless offline start 命令重新启动服务。这将强制使用适当的 Local Secondary Indexes.

重新创建本地 DynamoDB 数据库文件

要删除本地 DynamoDB 数据库文件,请执行以下操作:

  1. 通过指定 DynamoDB 数据库的路径更新 serverless.yml,如下所示:
custom:
  dynamodb:
    stages:
      - ${self:provider.stage}
    start:
      port: 8000
      inMemory: true
      migrate: true
      dbPath: "./.db" # Make sure that folder exists!
  1. 现在您可以转到文件夹 ./.db 并删除文件 shared-local-instance.db(这是一个模仿 DynamoDB 的 SQLite 数据库 :0)。

作为下一次使用命令 serverless offline start 启动的结果,将创建 最新 本地 DynamoDB 数据库文件。