【问题标题】:AWS AppSync - GraphQL API Mapping Template ErrorAWS AppSync - GraphQL API 映射模板错误
【发布时间】:2022-01-23 01:04:41
【问题描述】:

我正在尝试将我的 GraphQL Web API 与 AppSync 集成。但我收到以下错误

"errorType": "MappingTemplate",
"message": "Template transformation yielded an empty response."

我的数据源 HTTP 端点是:https://mybooking123.com

我的查询是:

mutation
{
    Booking(ID:111,BusNumber:"AAAA1", comment:"None")
   {
     BusNumber
     PassngerName
     TravelDate
     TravelTime
     ValidityDate
     ValidaityTime
     ErrorCode
  }
}: [BookingResponse]

架构

type Mutation {
    Booking(
       ID: Int!,
       BusNumber: String,
       comment: String
       ): [BookingResponse]
  }


 type BookingResponse 
 {
    BusNumber: String
    PassngerName: String
    BookingDate: String
    BookingTime: String
    ValidityDate: String
    ValidaityTime: String
    ErrorCode: Int
 }

AppSync - 请求映射模板

{
  "version": "2018-05-29",
  "method": "POST",
   "resourcePath": "/GraphQL",
  "params":{
     "query":$util.toJson($ctx.args),
      "headers": {
        "Authorization": "$ctx.request.headers.Authorization"
  }
 }
}

AppSync - 响应映射模板

## Raise a GraphQL field error in case of a datasource invocation error
#if($ctx.error)
   $util.error($ctx.error.message, $ctx.error.type)
#end
## If the response is not 200 then return an error. Else return the body **
#if($ctx.result.statusCode == 200)
   #set($body = $util.parseJson($ctx.result.body))
   $util.toJson($body) ##make it $body.data depending on the return on your rest api
#else
   $utils.appendError($ctx.result.body, "$ctx.result.statusCode")
#end

我的 GraphQL API 不使用 AppSync。但我想实现 AppSync 来访问 GraphQL API。我不确定模板映射有什么问题。感谢您的帮助。

【问题讨论】:

    标签: c# graphql aws-appsync webapi vtl


    【解决方案1】:

    问题可能出在$utils.appendError VTL 方法(响应映射模板的第 10 行)。

    根据您的响应映​​射模板,如果 Velocity 解析中出现错误,AppSync 将抛出错误(第 2 行)。

    如果没有错误,Velocity 解析器将评估响应 ($ctx.result) 并在 statusCode 等于 200 时发回 body。到目前为止一切顺利。问题是statusCode 是否不同于 200(第 9 行)。

    在这种情况下,AppSync 也应该引发错误。但是您使用的是$util.appendError。在这种情况下,VTL 会将错误信息添加到上下文中,并将继续生成结果模板。但是因为在这一步之后它没有做任何事情,所以生成的模板是空的(模板转换产生了一个空响应。)。

    来自AppSync Resolver Mapping Util docs的信息:

    $util.appendError(字符串)

    附加一个自定义错误。如果模板检测到请求或调用结果错误,则可以在请求或响应映射模板中使用此功能。与 $util.error(String) 不同,模板求值不会被中断,因此可以将数据返回给调用者。

    在 GraphQL 中,响应可能有一部分是成功的,一部分是错误的。发生这种情况是因为响应可能来自两个不同的解析器。如果其中一个在另一个不起作用,您可以在最终的 GraphQL 响应中获得两个响应。在这种情况下,AppSync 会将成功响应添加到预期的 GraphQL 字段,并将错误添加到上下文中。

    要解决您的问题,请在第 10 行使用 $util.error 而不是使用 $util.appendError。这样,如果您的调用失败,AppSync 将添加错误信息并停止 VLT 执行,而不是尝试执行后续步骤产生结果。

    【讨论】:

    • 感谢您的意见。我尝试了您的输入,并在稍微更新了模板映射后。现在我在运行查询时遇到错误:“”不允许 JSON 字符串末尾的尾随字符。”
    猜你喜欢
    • 2019-07-19
    • 2020-09-28
    • 2020-11-12
    • 2020-02-17
    • 2017-11-30
    • 2019-07-11
    • 2019-09-01
    • 2020-11-23
    • 2020-09-10
    相关资源
    最近更新 更多