如何在AWS appSync的Apache Velocity请求映射模板中操作字符串和数组?

问题描述 投票:2回答:1

这是我第一次使用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的响应消毒后返回呢?

amazon-web-services graphql aws-appsync apache-velocity
1个回答
2
投票

我也有类似的问题,我是这样解决的。

首先,你的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"
      ]
    }
  }
}

希望对你有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.