我正在写一个graphql代理。 (如何)您会用一个吗?

我在graphcms.com上的朋友问我是否可以构建概念证明graphql代理。 Graphcms是作为服务提供者的多租户graphql cms。

在幕后,他们正在使用prisma。 重要的是它们的公共可用模式与内部模式不同。 他们想隐藏一些对客户不重要的字段,同时还向公共架构添加一些字段,这些字段在内部架构中不存在或在其他“方式”中存在。 例如,这用于实现国际化。 他们当前的解决方案是手动构建的node.JS api网关。

让我们从介绍公开模式的一小部分开始。 在这篇文章中,我要重点介绍的是Asset类型,它具有两个字段url和handle。

首先,这是公开可用的架构:

第二个私有模式:

接下来来自客户端的查询:

最后,查询我们将如何重写它,以便pyramida可以执行它:

我们想要发回给客户的公开回复可能是这样的……

…同时,prisma的内部响应如下所示:

现在,对于第一部分,我们要做的是实现某种中间件机制,该机制将重写请求。 我通常在TDD的帮助下工作,所以我们开始吧。

两个非常简单的go子测试。 周围的所有活动部件都没有太大的兴趣。 仅关注应删除/添加到查询中的字段。

完整的源代码在这里:

jensneuse / graphql-go-tools
graphql golang go解析器词法分析器。 通过在GitHub上创建一个帐户,为jensneuse / graphql-go-tools开发做出贡献。 github.com

这是一个非常基本的中间件的样子:

  • 查找是一个简单的助手,可以快速查找事物。
  • 沃克帮助我们在AST周围走动。
  • 如果我们想直接访问解析器,我们可以。
  • 最后是ManualAstMod,它是另一个简化ast修改的助手。

免责声明:如果您像在Node中那样编写内容,那么在Go中保持内容整洁,易于使用和性能并不是那么容易。 输入Go并输入转义分析不是太高级,因此您必须考虑一些事情以实现性能和可维护性。

现在,让我们看一下OnRequest中间件的草案。 这很简单。 我们将一些切片转换为名称,因为内部文字只是整数引用。 我不从lexer到解析器再到验证等复制文字。只有一个字节片保留原始输入。 所有其余的只是参考。

我通常不会内联注释,但是在这种情况下,我试图逐行解释所有内容,因为这是一个poc示例。

在此示例中缺少的是响应的重写。 JSON解析和操作是一个已解决的问题,因此我在这里完全跳过此主题。

那么从这里去哪里呢? 我们该怎么办?

我看到一些选择:

  1. 该库还有更多扩展,一个应该可以轻松编写适合其特定情况的graphql代理。
  2. 我们还可以定义一些中间件并添加一个“配置层”。 我考虑过将指令写入架构以直接配置代理。 可能的方案可能是模式拼接/委托,删除字段,重命名字段,隐藏字段,身份验证,授权等。
  3. 构建可插拔系统。 Golang允许构建代码作为插件。 那么如何实现中间件接口,将其构建为插件然后挂接到代理中呢? 这也可以通过指令进行配置。

你怎么看? 您是否考虑过使用graphql代理? 需要一个吗? 您将如何使用? 您想如何配置一个?

如果您有兴趣跟踪功能的进度,请访问WIP PR:

WIP通过jensneuse添加代理·拉取请求#22·jensneuse / graphql-go-tools
此PR用于跟踪构建poc graphql代理的进度。 最初在示例中有一个中间件…… github.com