aws-appsync - 通过 AWS appsync 对 graphql 服务器的代理请求
问题描述
我在我的一个 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中的描述不同,我至少看到两个问题:
- 如果我有一个带有参数和嵌套
$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}"
- 假设我有一个查询,并且我
user
在 appsync 中为查询定义了解析器,查询如下所示:
{
user(id: "1") {
picture {
url
}
}
我通过 appsync 调用我的 graphql 后端,在我的 graphql 日志中,我看到记录了以下响应:
{
"data: {
"user": {
"picture": {
"url": "example.com/link/to/a/picture"
}
}
}
}
但是 appsync 会返回给我的响应:
{
"data: {
"user": {
"picture": null
}
}
}
我已经想通了,appsync 期望我将为两者user
和picture
查询定义解析器。Appsync 想先调用user
然后picture
查询,但我想做的只是通过 appsync 代理响应,而不调用任何其他查询,除了user
. 一切都在我的 graphql 后端进行评估,应该只放在响应正文中,但 appsync 想再评估一次。
没有1.和2.有什么解决方案吗?
解决方案
在撰写本文时,您可以使用该$ctx.info
对象从解析器中获取查询的选择集,并通过 HTTP 解析器将相关数据发送到您的下游服务。转到此处并查找 $ctx 对象上的信息字段。要完成这项工作,您需要在 AppSync API 中镜像下游 API 的架构。
感谢您提出这个问题。团队了解这些用例,这有助于确定优先级。