我尝试在查询中使用 FilterExpression 过滤 DynamoDB 表扫描的结果。我正在使用部署在 AWS 上的 API Gateway 上的 Lambda 函数。
查询端点的函数
// Scan the table for entries and use data to populate HTML table.
async function scanTable(){
var query = {
TableName: "bookings",
ProjectionExpression: "id, username, start_booking, end_booking",
FilterExpression: "username = :u",
ExpressionAttributeValues: {":u":"[email protected]"}
};
try{
const response = await axios({ method: 'get', url: `${url}/bookings`, params: query });
}catch(err){
console.log(err);
}
}
Lambda 函数
'use strict'
const AWS = require('aws-sdk');
exports.handler = async (event, context) => {
const documentClient = new AWS.DynamoDB.DocumentClient({convertEmptyValues: true});
let responseBody = "";
let statusCode = 0;
const params = (event.queryStringParameters);
// console.log(params);
try{
const data = await documentClient.scan(params).promise();
responseBody = JSON.stringify(data.Items);
statusCode = 200;
}catch(err){
responseBody = `Unable to get the bookings: ${err}`;
statusCode = 403;
}
console.log("Response Body: " + responseBody);
const response = {
statusCode: statusCode,
headers: {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*"
},
body: responseBody
};
return response;
}
我收到的完整错误是
ValidationException: ExpressionAttributeValues contains invalid key: Syntax error; key: "11"
错误末尾的键值(键:“11”)在某种程度上取决于在 ExpressionAttributeValues 中分配的值。我尝试按照 DynamoDB 文档中的 FilterExpression 示例进行扫描功能,但无济于事。这是另一个示例。
这里是来自AWS论坛的类似问题。
我认为你应该将 ExpressionAttributeValues 修改为:
var query = {
TableName: "bookings",
ProjectionExpression: "id, username, start_booking, end_booking",
FilterExpression: "username = :u",
ExpressionAttributeValues: { 'S': "[email protected]" }
};