【问题标题】:Proxy request to graphql server through AWS appsync通过 AWS appsync 对 graphql 服务器的代理请求
【发布时间】:2020-06-07 05:19:30
【问题描述】:

我在我的一个 EC2 实例上运行了一个 graphql 服务器。我也有 AWS appsync 正在运行,但目前它只与几个 lambdas 集成。

我想将我的 Appsync 与 graphql 服务器连接起来,因此 Appsync 将充当特定查询/突变的代理。

所以从客户端看,它看起来像这样:

  • 客户端向 appsync 发送查询,假设它看起来像这样:
{
  user {
    id
  }
} 
  • Appsync 定义了一个 user 查询,它被配置为将查询代理到 graphql 服务器,无需任何更改
  • Graphql 服务器能够处理以下查询:
{
  user {
    id
  }
} 

并返回结果:

"data": {
  "user": {
    "id": "123456789"
  }
}
  • 最终 Appsync 代理响应返回给客户端

我能否以给定场景可能的方式配置 Appsync?使用 Appsync 的模式是否正确?

更新1.@mparis回复后

我能够通过 AppSync 代理我的请求,并通过以下解析器配置访问我的 graphql 服务器:

{
    "version": "2018-05-29",
    "method": "POST",
    "resourcePath": "/graphql",
    "params":{
        "body": {
          "query": "$util.escapeJavaScript($ctx.info.getSelectionSetGraphQL())"
        }
    }
}

但这仍然无法按预期工作 - 它与 docs 中的描述不同,我发现至少有两个问题:

  1. 如果我有一个带有参数和嵌套有效载荷的查询,$ctx.info.getSelectionSetGraphQL() 会删除查询名称和参数部分,只给我嵌套有效载荷,所以这个查询:
{ 
  user(id: "1") {
    picture {
      url
    }
}

成为关注者,一旦我调用$ctx.info.getSelectionSetGraphQL()

{
   picture {
     url
   }
}

但我想使用整个查询,与文档中描述的相同:

"selectionSetGraphQL": "{\n  getPost(id: $postId) {\n    postId\n    title\n    secondTitle: title\n    content\n    author(id: $authorId) {\n      authorId\n      name\n    }\n    secondAuthor(id: \"789\") {\n      authorId\n    }\n    ... on Post {\n      inlineFrag: comments {\n        id\n      }\n    }\n    ... postFrag\n  }\n}"
  1. 假设我有一个查询,我在 appsync 中为 user 查询定义了解析器,查询如下所示:
{ 
  user(id: "1") {
    picture {
      url
    }
}

我通过 appsync 调用我的 graphql 后端,在我的 graphql 日志中我看到记录了以下响应:

{
  "data: {
    "user": {
      "picture": {
        "url": "example.com/link/to/a/picture"
      }
    }
  }
}

但 appsync 会返回给我的响应:

{
  "data: {
    "user": {
      "picture": null
    }
  }
}

我发现,appsync 期望我为userpicture 查询定义解析器。 Appsync 想先调用user,然后调用picture 查询,但我想做的只是通过appsync 代理响应,而不调用除user 之外的任何其他查询。一切都在我的 graphql 后端进行评估,应该只放在响应正文中,但 appsync 想再评估一次。

没有1.和2.有什么解决方案吗?

【问题讨论】:

  • 您解决了这个代理问题吗?
  • 不,我没有。不得不放弃这种方法,所以我没有探索它,因为

标签: aws-appsync


【解决方案1】:

在撰写本文时,您可以使用 $ctx.info 对象从解析器中获取查询选择集,并通过 HTTP 解析器将相关数据发送到您的下游服务。 Go here and look for the info field on the $ctx object. 要完成这项工作,您需要在 AppSync API 中镜像下游 API 的架构。

感谢您提出这个问题。团队了解这些用例,这有助于确定优先级。

【讨论】:

  • 感谢您的回复!我已尝试实施您的解决方案,但介于两者之间的是另一个问题/问题。请您看看我在主题中的更新,好吗?
猜你喜欢
  • 2022-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
相关资源
最近更新 更多