【问题标题】:Condition parameter type does not match schema type条件参数类型与架构类型不匹配
【发布时间】:2018-09-10 02:15:10
【问题描述】:

我在 dynamoDB 中有一个名为“Contributors”的表。我有一个主复合键,其中哈希键是“UserId”,排序键是“NoteId”。我想查询属于特定哈希键的所有项目。

现在,如果我使用 aws-cli,以下命令有效:

aws dynamodb query \
--table-name Contributors \
--key-condition-expression 'UserId = :UserId' \
--expression-attribute-values '{
    ":UserId": {"N":"2"}
}'

但是当我在 Node.js 中编写查询时,以下 2 个参数对象都不起作用:

var params = {
    TableName: "Contributors",
    KeyConditionExpression: "#UserId = :UserId",
    ExpressionAttributeNames: {
        "#UserId": "UserId"
    },
    ExpressionAttributeValues: {
        ":UserId": { "N": "2" }
    }
};

或者这个:

var params = {
    TableName: "Contributors",
    KeyConditionExpression: "#UserId = :UserId",
    ExpressionAttributeNames: {
        "#UserId": "UserId"
    },
    ExpressionAttributeValues: {
        ":UserId": "2"
    }
};

我收到以下错误:

ValidationException:一个或多个参数值无效: 条件参数类型与架构类型不匹配

正确的参数对象应该是什么?

【问题讨论】:

    标签: node.js amazon-web-services amazon-dynamodb


    【解决方案1】:

    以下代码应该可以工作。只需给出不带双引号的值。 DocumentClient 将自动解释数据类型。

    var docClient = new AWS.DynamoDB.DocumentClient();
    
    var params = {
        TableName: "Contributors",
        KeyConditionExpression: "#UserId = :UserId",
        ExpressionAttributeNames: {
            "#UserId": "UserId"
        },
        ExpressionAttributeValues: {
            ":UserId": 2
        }
    };
    
    docClient.query(params, function(err, data) {
        if (err) {
            console.error("Unable to read item. Error JSON:", JSON.stringify(err,
                    null, 2));
        } else {
            console.log("GetItem succeeded:", JSON.stringify(data, null, 2));
        }
    });
    

    【讨论】:

    • 这为我解决了!似乎适用于 Javascript 的 AWS 开发工具包文档是指 AWS.DynamoDB() 类。我遇到了这个问题,因为我试图用 AWS.DynamoDB.DocumentClient() 实现 SDK 文档示例。
    【解决方案2】:

    由于将数据类型与值一起传递,我遇到了问题。只需删除数据类型 DocumentClient 将自动解释数据类型并且它可以工作:

    发件人:

    ExpressionAttributeValues: {
     ":UserId": { "S": req.query.status }
    }
    

    收件人:

    ExpressionAttributeValues: {
     ":UserId": req.query.status
    }
    

    【讨论】:

    • 这确实有效,但会降低代码质量,并且您不能将此查询与 aws cli --cli-input-json 选项一起使用,因为未指定数据类型。
    • 这对我有用。我尝试发送{"N":1}{"N":"1"} 甚至{"S":"1"}。没有工作。
    • 他们为什么要这么做。
    【解决方案3】:

    替换:

    var docClient = new AWS.DynamoDB.DocumentClient();
    

    与:

    var docClient = new AWS.DynamoDB();
    

    立即为我解决了这个问题。

    【讨论】:

    • 这行得通,但如果你使用 docClient.get 会中断。它还包括结果文档中的类型,这有点烦人。
    猜你喜欢
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多