如何在AppSync查询中传递数组参数?解决类型错误问题
问题描述
我创建了一个带可选ID数组参数的AppSync查询,用该数组作为过滤器,仅返回包含数组中任一ID的数据。仅传入必填的padId参数时查询正常,但加入locationIds数组参数后,请求抛出MappingTemplate类型错误,相关信息及代码如下:
GraphQL 定义
items( padId: ID! locationIds: [ID] ): [item] @http(url: "https://api-${env}/item")
AppSync 请求
items(query: { padId: "63879aed-8f7a-4230-8215-921333ba198d", locationIds: ["2b3a5532-73b1-4248-95d9-c91506d73493"] })
AppSync 返回错误
{ "data": { "items": null }, "errors": [ { "path": [ "items" ], "data": null, "errorType": "MappingTemplate", "errorInfo": null, "locations": [ { "line": 2, "column": 3, "sourceName": null } ], "message": "Value for field '$[params][query]' not a valid type." } ] }
问题原因及解决方法
1. 修正请求参数结构(首要解决点)
你的GraphQL查询参数传递方式和定义不匹配:items字段的参数是直接声明的padId和locationIds,但请求中却把它们嵌套在了query对象里。这会导致AppSync无法正确解析参数,触发类型错误。
正确的请求格式应为:
items( padId: "63879aed-8f7a-4230-8215-921333ba198d", locationIds: ["2b3a5532-73b1-4248-95d9-c91506d73493"] )
2. 调整HTTP数据源映射模板
如果修正请求后仍报错,说明AppSync默认的映射模板无法正确处理数组类型的查询参数,需要自定义VTL模板适配后端API的参数格式:
场景1:后端接收逗号分隔的ID字符串
{ "version": "2018-05-29", "method": "GET", "resourcePath": "/item", "params": { "query": { "padId": "$context.arguments.padId", "locationIds": #foreach($id in $context.arguments.locationIds)#if($foreach.index > 0),#end$id#end } } }
场景2:后端接收数组格式的查询参数(如locationIds[]=id1&locationIds[]=id2)
{ "version": "2018-05-29", "method": "GET", "resourcePath": "/item", "params": { "query": { "padId": "$context.arguments.padId" } } } #foreach($id in $context.arguments.locationIds) #set($discard = $context.params.query.put("locationIds[]", $id)) #end
3. 确认后端API的参数要求
不同后端框架对数组查询参数的解析规则不同,需要根据后端实际接受的格式(如逗号分隔、多键名、JSON字符串)调整映射模板的参数生成逻辑。
内容的提问来源于stack exchange,提问作者Cristian Diaz
相关产品推荐
相关产品推荐

