如何为 RDS 数据源编写 AWS AppSync 响应映射模板

How to write a AWS AppSync response mapping template for an RDS data source

我一直在关注此 guide 通过 AppSync 模式查询 Aurora Serverless 数据库。现在我想 运行 同时进行几个查询,请求映射如下:

{
    "version": "2018-05-29",
        "statements": [
            "SELECT * FROM MyTable WHERE category='$ctx.args.category'",
            "SELECT COUNT(*) FROM MyTable WHERE category='$ctx.args.category'",
    ]
}

那么,如何处理响应映射中的多选呢?该页面有几个示例,但 none 有两个选择:

$utils.toJson($utils.rds.toJsonObject($ctx.result)[0])    ## For first item results
$utils.toJson($utils.rds.toJsonObject($ctx.result)[0][0]) ## For first item of first query
$utils.toJson($utils.rds.toJsonObject($ctx.result)[1][0]) ## For first item of second query
$utils.toJson($utils.rds.toJsonObject($ctx.result)??????) ## ?? For first & second item results

我预测的响应类型如下,但不严格,只要我能得到值。

type MyResponse {
    MyResponseItemList [MyResponseItem]
    Count Int
}

type MyResponseItem {
  Id: ID!
  Name: String
  ...
}

进行两次选择将不适用于 AppSync。

我建议您要么将两个 SQL 查询拆分为两个不同的 GraphQL 查询操作,要么将两个 SQL 查询合并为一个。

FWIW,我刚开始使用 UNION ALL Appsync/RDS 带有两个 SELECT 的请求解析器查询:

  {  
    "version": "2018-05-29",   
    "statements": ["SELECT patientIDa, patientIDb, distance FROM Distances WHERE patientIDa='$ctx.args.patientID' UNION ALL SELECT patientIDb, patientIDa, distance FROM Distances WHERE patientIDb='$ctx.args.patientID'"]  
}

不确定这是否对 OP 有帮助,但可能会。

***注意:在我的例子中(可能是因为我在 windows 上)整个 ["SELECT...] 语句需要在一行上(没有 cr/lf)否则"non-escaped character..." 的 graphql 错误(使用 GraphiQL 测试)

我遇到了同样的问题,并且按如下方式运行。

我没有将 Count 作为直接的 Int 类型结果,而是将其转换为另一种类型,称为 PaginationResult。

type MyResponse {
    MyResponseItemList [MyResponseItem]
    Count PaginationResult
}

type PaginationResult {
   Count Int
}

type MyResponseItem {
...
}

响应速度模板

#set($resMap = {
    "MyResponseItemList": $utils.rds.toJsonObject($ctx.result)[0],
    "Count": $utils.rds.toJsonObject($ctx.result)[1][0]
})
$util.toJson($resMap)