首页 > 解决方案 > 通过 AWS appsync 对 graphql 服务器的代理请求

问题描述

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

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

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

{
  user {
    id
  }
} 
{
  user {
    id
  }
} 

并返回结果:

"data": {
  "user": {
    "id": "123456789"
  }
}

我是否能够以给定场景可能的方式配置 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. 假设我有一个查询,并且我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 期望我将为两者userpicture查询定义解析器。Appsync 想先调用user然后picture查询,但我想做的只是通过 appsync 代理响应,而不调用任何其他查询,除了user. 一切都在我的 graphql 后端进行评估,应该只放在响应正文中,但 appsync 想再评估一次。

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

标签: aws-appsync

解决方案


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

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


推荐阅读