Node.js dynamo get ValidationException中出现无服务器错误:提供的键元素与架构不匹配

Node.js dynamo get ValidationException中出现无服务器错误:提供的键元素与架构不匹配,node.js,amazon-web-services,amazon-dynamodb,serverless-framework,dynamodb-queries,Node.js,Amazon Web Services,Amazon Dynamodb,Serverless Framework,Dynamodb Queries,我使用serverless创建和查询DynamoDB数据库表,但如果不使用主键进行查询,则会出现以下错误: dynamo get ValidationException中的信息错误:提供的键元素与架构不匹配 我有另一个密钥设置作为GSI,但我仍然得到错误 serverless.yml ... resources: Resources: BeaconTable: Type: AWS::DynamoDB::Table Properties: Ta

我使用serverless创建和查询DynamoDB数据库表,但如果不使用主键进行查询,则会出现以下错误:

dynamo get ValidationException中的信息错误:提供的键元素与架构不匹配

我有另一个密钥设置作为GSI,但我仍然得到错误

serverless.yml

...

resources:
  Resources:
    BeaconTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: venue-table
        AttributeDefinitions:
          - AttributeName: VenueID
            AttributeType: S
        KeySchema:
          - AttributeName: VenueID
            KeyType: HASH
        BillingMode: PAY_PER_REQUEST
Dynamo.js

const AWS = require('aws-sdk');

const documentClient = new AWS.DynamoDB.DocumentClient();

const Dynamo = {
    async get(TableName){
        const params = {
            TableName,
            Key:{
                "BeaconAddr": <string> // Hardcoded string
            }
        };

        const data = await documentClient
            .get(params)
            .promise()

        if (!data || !data.Item){
            throw Error(`There was an error fetching the data for ID of ${ID} from ${TableName}`)
        }
        console.log(data);

        return data;
    },

    async write(data, TableName){
        if (!data.ID){
            throw Error('no ID on the data');
        }

        const params = {
            TableName,
            Item: data
        };

        const res = await documentClient.put(params).promise();

        if (!res) {
            throw Error(`There was an error inserting ID of ${data.ID} in table ${TableName}`)
        }

        return data;
    }

};

module.exports = Dynamo;

const AWS=require('AWS-sdk');
const documentClient=new AWS.DynamoDB.documentClient();
恒发电机={
异步获取(表名){
常量参数={
表名,
关键:{
“BeaconAddr”://硬编码字符串
}
};
const data=wait documentClient
.get(参数)
.承诺
如果(!data | |!data.Item){
抛出错误(`从${TableName}获取${ID}的ID数据时出错`)
}
控制台日志(数据);
返回数据;
},
异步写入(数据、表名){
如果(!data.ID){
抛出错误(“数据上没有ID”);
}
常量参数={
表名,
项目:数据
};
const res=await documentClient.put(params.promise();
如果(!res){
抛出错误(`在表${TableName}中插入${data.ID}的ID时出错`)
}
返回数据;
}
};
module.exports=发电机;
当键为“VenueID”时,查询工作,但当我将其更改为“BeaconAddr”(这是一个GSI)时,会出现错误。我做错了什么

下表所示为:


A
get
在DynamoDB中的操作仅在表的主键上可用。您的表定义(如
serverless.yml
中所示)只包含一个分区键(也称为哈希),因此使用
get
操作的唯一方法是通过键请求单个项(您已将其命名为
VenueID
)。如果您希望排序键(aka RANGE)是
SK
属性,分区键是
PK
属性,那么您的表定义需要如下所示:

BeaconTable:
类型:AWS::DynamoDB::Table
特性:
表名:场地表
属性定义:
-属性名称:PK
属性类型:S
-属性名称:SK
属性类型:S
KeySchema:
-属性名称:PK
关键字类型:哈希
-属性名称:SK
键类型:范围
计费模式:按请求付费
请注意,定义中未提及
VenueID
BeaconAddr
。您可以将上面显示的值放入这些字段中。如您所示,要添加GSI,您需要具备以下条件:

BeaconTable:
类型:AWS::DynamoDB::Table
特性:
表名:场地表
属性定义:
-属性名称:PK
属性类型:S
-属性名称:SK
属性类型:S
-属性名称:GSI-1-PK
属性类型:S
-属性名称:GSI-1-SK
属性类型:S
KeySchema:
-属性名称:PK
关键字类型:哈希
-属性名称:SK
键类型:范围
全球次级指数:
-索引名称:GSI-1
KeySchema:
-属性名称:“GSI-1-PK”
关键字类型:哈希
-属性名称:GSI-1-SK
键类型:范围
计费模式:按请求付费
请注意,此处有单独的列。进入这些列的数据由您自己填充


最后,当查询GSI时(您不能对GSI执行
get
),必须在查询中提供索引名。

DynamoDB中的
get
操作仅在表的主键上可用。您的表定义(如
serverless.yml
中所示)只包含一个分区键(也称为哈希),因此使用
get
操作的唯一方法是通过键请求单个项(您已将其命名为
VenueID
)。如果您希望排序键(aka RANGE)是
SK
属性,分区键是
PK
属性,那么您的表定义需要如下所示:

BeaconTable:
类型:AWS::DynamoDB::Table
特性:
表名:场地表
属性定义:
-属性名称:PK
属性类型:S
-属性名称:SK
属性类型:S
KeySchema:
-属性名称:PK
关键字类型:哈希
-属性名称:SK
键类型:范围
计费模式:按请求付费
请注意,定义中未提及
VenueID
BeaconAddr
。您可以将上面显示的值放入这些字段中。如您所示,要添加GSI,您需要具备以下条件:

BeaconTable:
类型:AWS::DynamoDB::Table
特性:
表名:场地表
属性定义:
-属性名称:PK
属性类型:S
-属性名称:SK
属性类型:S
-属性名称:GSI-1-PK
属性类型:S
-属性名称:GSI-1-SK
属性类型:S
KeySchema:
-属性名称:PK
关键字类型:哈希
-属性名称:SK
键类型:范围
全球次级指数:
-索引名称:GSI-1
KeySchema:
-属性名称:“GSI-1-PK”
关键字类型:哈希
-属性名称:GSI-1-SK
键类型:范围
计费模式:按请求付费
请注意,存在separ