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

Posted

技术标签:

【中文标题】如何在 AWS appSync 的 Apache Velocity 请求映射模板中操作字符串和数组【英文标题】:How to manipulate strings and array in Apache Velocity request mapping template in AWS appSync 【发布时间】:2020-08-30 03:03:31 【问题描述】:

这是我第一次使用 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"
    ]

为了获得所需的输出,我更改了响应模板,因为我想遍历从数据库获得的响应,并使用给定的子字符串方法从字符串中删除 city= in AWS resolver mapping docs,这就是我正面临这个问题。

我的回复模板

#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 的响应并返回它呢?

【问题讨论】:

【参考方案1】:

我遇到了类似的问题,我就是这样解决的。

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

希望对你有帮助。

【讨论】:

您的解决方案就像一个魅力。非常感谢你的帮助。您能否指点我一些资源,以便我能更好地理解这一切?再次感谢您。 很高兴为您提供帮助。我通常会参考 AWS 开发人员指南、***,有时还会参考 AWS 论坛。除此之外,Adrian Hall 和 Nader Dabit 有一些关于 AppSync 的精彩教程和指南;你也应该检查一下!

以上是关于如何在 AWS appSync 的 Apache Velocity 请求映射模板中操作字符串和数组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 IAM 在 AWS Lambda 中调用 AppSync?

如何使用 AWS appsync (GraphQL) 禁用自省查询?

如何在 AWS AppSync 控制台中测试订阅?

如何在 aws AppSync 中按 createdAt 和 updatedAt 排序和过滤?

如何使用 AWS AppSync 将文件上传到 AWS S3

如何在 Graphql 架构级别检查 AWS AppSync OIDC 指令的角色或权限