通过AWS appsync向graphql服务器代理请求

Paw*_*zka 5 aws-appsync

我的一个 EC2 实例上运行着一台 graphql 服务器。我还运行了 AWS appsync,但目前它仅与几个 lambda 集成。

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

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

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

并返回结果:

"data": {
  "user": {
    "id": "123456789"
  }
}
Run Code Online (Sandbox Code Playgroud)
  • 最后 Appsync 代理响应返回客户端

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

更新 1. @mparis回复后

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

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

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

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

一旦我打电话,就变成以下之一$ctx.info.getSelectionSetGraphQL()

{
   picture {
     url
   }
}
Run Code Online (Sandbox Code Playgroud)

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

"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}"
Run Code Online (Sandbox Code Playgroud)
  1. 假设我有一个查询,并且我已经user在 appsync 中定义了查询解析器,查询如下所示:
{ 
  user(id: "1") {
    picture {
      url
    }
}
Run Code Online (Sandbox Code Playgroud)

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

{
  "data: {
    "user": {
      "picture": {
        "url": "example.com/link/to/a/picture"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但 appsync 返回给我的给出的响应:

{
  "data: {
    "user": {
      "picture": null
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

对于1.2.有什么解决办法吗?

mpa*_*ris 0

截至撰写本文时,您可以使用该$ctx.info对象从解析器中获取查询选择集,并通过 HTTP 解析器将相关数据发送到下游服务。转到此处并查找 $ctx 对象上的信息字段。要实现此目的,您需要在 AppSync API 中镜像下游 API 的架构。

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