这是我第一次使用VTL,如果我的代码有很傻的地方,请指正。
我想实现的目标是
{
"cities": ["jaipur", "mumbai", "delhi", "sheros", "jalandhar", "bengaluru"]
}
Graphql模式。
type Query{
getCitiesForGroups: String
}
默认的响应模板。
#if($ctx.error)
$utils.error($ctx.error.message, $ctx.error.type)
#end
$utils.toJson($utils.rds.toJsonObject($ctx.result)[0])
使用默认的响应模板, 我得到的结果是:
{ "data": { "getCitiesForGroups": [ "{groupcity=jaipur}", "{groupcity=mumbai}", "{groupcity=delhi}", "{groupcity=sheros}", "{groupcity=jalandhar}", "{groupcity=bengaluru}" ] } }
我的请求模板
{
"version": "2018-05-29",
"statements": [
"select DISTINCT LOWER(city) as city from public.Groups"
]
}
为了得到所需的输出,我改变了响应模板,因为我想循环处理从DB中得到的响应,并删除了 {city=}
通过使用给定的子串方法从字符串中提取出 在AWS解析器映射文档中 这就是我所面临的问题。
我的回复模板
#if($ctx.error)
$utils.error($ctx.error.message, $ctx.error.type)
#end
#set ($rawListOfCities = $utils.rds.toJsonObject($ctx.result)[0])
#set ($sanitisedListOfCities = [])
#foreach( $city in $rawListOfCities )
#set ($equalToIndex = $city.indexOf("="))
#set ($equalToIndex = $equalToIndex + 1)
#set ($curlyLastIndex = $city.lastIndexOf("}"))
#set ($tempCity = $city.substring($equalToIndex, $curlyLastIndex))
## #set ($tempCity = $city)
$util.qr($sanitisedListOfCities.add($tempCity))
#end
$util.toJson($sanitisedListOfCities)
我得到的回应。
{
"data": {
"getCitiesForGroups": "[null, null, null, null, null, null]"
}
}
然而,当我使用这一行 #set ($tempCity = $city)
并将上面的一行注释出来,我得到了以下的回复。
{
"data": {
"getCitiesForGroups": "[{city=jaipur}, {city=mumbai}, {city=delhi}, {city=sheros}, {city=jalandhar}, {city=bengaluru}]"
}
}
这意味着 $city
有价值 {city=jaipur}
因此,我想把它消毒并添加到 ($sanitisedListOfCities)
并将其作为响应返回。
但我得到的是 null
作为结果子串方法。
那么,我怎样才能把DB的响应消毒后返回呢?
我也有类似的问题,我是这样解决的。
首先,你的Graphql模式应该是这样的。
type Query {
getCitiesForGroups: cityList
}
type cityList {
cities: [String]
}
您的请求映射模板。
{
"version": "2018-05-29",
"statements": [
"select DISTINCT LOWER(city) as city from public.Groups"
]
}
最后是你的响应映射模板
#set($cityList = [])
#set($resMap = {})
#if($ctx.error)
$utils.error($ctx.error.message, $ctx.error.type)
#end
#foreach($item in $utils.rds.toJsonObject($ctx.result)[0])
$util.qr($cityList.add($item.city))
#end
$util.qr($resMap.put("cities", $cityList))
#return($resMap)
预期答复(完整)
{
"data": {
"getCitiesForGroups": {
"cities": [
"jaipur",
"mumbai",
"delhi",
"sheros",
"jalandhar",
"bengaluru"
]
}
}
}
希望对你有所帮助。