条件参数类型与架构类型不匹配

vis*_*ksh 3 amazon-web-services node.js amazon-dynamodb

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

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

aws dynamodb query \
--table-name Contributors \
--key-condition-expression 'UserId = :UserId' \
--expression-attribute-values '{
    ":UserId": {"N":"2"}
}'
Run Code Online (Sandbox Code Playgroud)

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

var params = {
    TableName: "Contributors",
    KeyConditionExpression: "#UserId = :UserId",
    ExpressionAttributeNames: {
        "#UserId": "UserId"
    },
    ExpressionAttributeValues: {
        ":UserId": { "N": "2" }
    }
};
Run Code Online (Sandbox Code Playgroud)

或这个:

var params = {
    TableName: "Contributors",
    KeyConditionExpression: "#UserId = :UserId",
    ExpressionAttributeNames: {
        "#UserId": "UserId"
    },
    ExpressionAttributeValues: {
        ":UserId": "2"
    }
};
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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

什么应该是正确的param对象?

sta*_*ool 23

由于传递数据类型和值,我遇到了问题。只需删除数据类型 DocumentClient 将自动解释数据类型,它的工作原理:

从:

ExpressionAttributeValues: {
 ":UserId": { "S": req.query.status }
}
Run Code Online (Sandbox Code Playgroud)

到:

ExpressionAttributeValues: {
 ":UserId": req.query.status
}
Run Code Online (Sandbox Code Playgroud)

  • 他们为什么要那样做。 (4认同)
  • 这对我有用。我尝试发送`{"N":1}`和`{"N":"1"}`甚至`{"S":"1"}`。没有一个起作用。 (2认同)

not*_*est 10

以下代码应该有效.只需给出没有双引号的值.该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));
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 这为我解决了这个问题!似乎适用于 Javascript 的 AWS SDK 文档引用了 AWS.DynamoDB() 类。我遇到这个问题是因为我尝试使用 AWS.DynamoDB.DocumentClient() 实现 SDK 文档示例。 (3认同)

Jam*_*iro 10

更换:

var docClient = new AWS.DynamoDB.DocumentClient();
Run Code Online (Sandbox Code Playgroud)

和:

var docClient = new AWS.DynamoDB();
Run Code Online (Sandbox Code Playgroud)

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