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

标签 amazon-web-services graphql aws-appsync apache-velocity

这是我第一次使用 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 作为结果子字符串方法。

那么我怎样才能清理来自数据库的响应并将其返回呢?

最佳答案

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

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

希望对你有帮助

关于amazon-web-services - 如何在 AWS appSync 中操作 Apache Velocity 请求映射模板中的字符串和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61782785/

相关文章:

javascript - 如何将签名的 HTTP 请求从 AWS Lambda 发送到 AppSync GraphQL?

php - 如何使用 Laravel 和 Elastic Beanstalk 上传文件?

amazon-web-services - DynamoDB 中的全局二级索引 (GSI) 影响表配置容量

javascript - 如何正确传递参数?

aws-cloudformation - serverless-appsync-plugin 'pipeline' 部署错误

android - 如何在 Android 上使用 IAM 或 Cognito Pool 作为身份验证方法而不是 API key

javascript - Alexa Just Listen 调用名称然后闪烁并停止?

ruby-on-rails - Rails 部署到 Amazon EC2 - 设备上没有剩余空间

graphql - 在 AWS Amplify GraphQL 中对结果进行排序而不进行过滤

relational-database - 解析相关对象的惯用且高效的方法是什么?