AWS AppSync解析器FilterExpression语法错误求助
解决AWS AppSync解析器中DynamoDB FilterExpression的IN语法错误
咱们先直接定位问题:你遇到的ValidationException是因为DynamoDB对IN运算符的语法有严格要求——IN后面必须用括号包裹占位符或值列表,你原来的写法topicId IN :ids漏掉了括号,这是导致语法错误的直接原因。
另外还要确认表达式值的格式是否符合DynamoDB的类型要求,下面是修正后的完整解析器代码:
{ "version" : "2017-02-28", "operation" : "Query", "query" : { "expression": "studentId = :id", "expressionValues" : { ":id" : { "S": "$ctx.args.studentId" } } }, "filter": { "expression": "topicId IN (:ids)", "expressionValues" : { ":ids" : { "NS" : $ctx.args.topicIds } } }, "index": "studentId-index" }
关键修改说明:
- 修正IN运算符语法:把
"expression": "topicId IN :ids"改为"expression": "topicId IN (:ids)",添加括号后符合DynamoDB的FilterExpression语法规范。 - 验证NS类型值的合法性:确保
$ctx.args.topicIds是数字字符串数组(比如["1", "2", "3"]),因为DynamoDB的NS类型要求元素必须是表示数字的字符串,不能是纯数字数组。如果你的入参是数字数组,需要在VTL中先转换为字符串数组,示例代码如下:
之后把#set($stringTopicIds = []) #foreach($id in $ctx.args.topicIds) #set($void = $stringTopicIds.add($id.toString())) #end$stringTopicIds替换到expressionValues的NS字段中即可。
额外验证点:
- 确认
studentId-index是存在且正确配置的全局二级索引,索引的分区键确实是studentId。 - 检查入参
studentId和topicIds是否正确传递,没有空值或格式错误。
内容的提问来源于stack exchange,提问作者Naveen Vignesh
相关产品推荐
相关产品推荐

