首页 > 解决方案 > DynamoDb PutItem 似乎正确,但 ValidationException: The provided key element does not match the schema

问题描述

我知道以前有人问过这个问题,并且根据这些答案,我很确定我所拥有的是正确的。在这一点上,老实说,我觉得我错过了一些超级基本的东西。

DynamoDB 连接器已设置:

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

// set up dynamoDB
const dynamoDb = new AWS.DynamoDB.DocumentClient();

我已经用无服务器中的键定义了一个 DynamoDB 表,如下所示:

CampaignStreamDynamoDbTable:
      Type: 'AWS::DynamoDB::Table'
      DeletionPolicy: Retain
      Properties:
        ProvisionedThroughput:
          ReadCapacityUnits: 5
          WriteCapacityUnits: 5
        AttributeDefinitions:
          - AttributeName: "id"
            AttributeType: "S"
          - AttributeName: "campaign_id"
            AttributeType: "S"
        KeySchema:
          - AttributeName: "id"
            KeyType: "HASH"
          - AttributeName: "campaign_id"
            KeyType: "RANGE"
        StreamSpecification:
          StreamViewType: "NEW_AND_OLD_IMAGES"
        TableName: ${self:provider.environment.FS_CAMPAIGN_STREAM_TABLE}

我有一个函数可以更新包含主键和范围键的表(第三个参数是我更新测试的状态):

let update_test_status = async (test_id, campaign_key, test_status) => {

console.info("Updating bulk test " + test_id + " with campaign_key "+campaign_key+" to " + test_status);
    let b = true;
    const timestamp = new Date().getTime();

    const update_params = {
        TableName: process.env.FS_CAMPAIGN_STREAM_TABLE,
        Key: {
            id: test_id,
            campaign_key: campaign_key
        },
        ProjectionExpression: "#s",
        ExpressionAttributeNames: {"#s": "status"},
        UpdateExpression: "set #s=:s, updated_at=:u",
        ExpressionAttributeValues: {
            ":s": test_status,
            ":u": timestamp,
        },
        ReturnValues: "UPDATED_NEW"
    };

    try {
        let results = await dynamoDb.update(update_params).promise();

    } catch (error) {
        console.error("Could not update the record: " + error);
        test_status = "error";
        console.error("Links processed, but error updating record in DB");
        b = false;

    }
    return b;

};
    
        try {
            let results = await dynamoDb.update(update_params).promise();
    
        } catch (error) {
            console.error("Could not update the record: " + error);
            test_status = "error";
            console.error("Links processed, but error updating record in DB");
            b = false;
    
        }
        return b;
    };

我这样称呼这个函数:

await update_test_status(item.id.S, item.campaign_key.S, "processing")

item 是 DynamoDB 记录

笔记:

我已经验证了 id 和 key 都被传递给了 update 方法。我已经尝试过带引号和不带引号的 KEY 参数

标签: amazon-dynamodb

解决方案


在您的表定义中,您调用了它,campaign_id但稍后在您的代码中调用了它campaign_key

看到错误时,您应该始终双重(和三重)检查哈希和范围键的名称和类型是否与定义中的相同。


推荐阅读