使用 Apollo Server 和 Koa 合并 GraphQL Schema

使用 Apollo Server 和 Koa 合并 GraphQL Schema

今天,在我们现代的开发者世界中,完全无法想象没有 React、Node JS、GraphQL 等技术的生活。他们拥有稳固的队伍,并在数据交付方面处于领先地位。我遇到的 70% 的案例是与 GraphQL 集成或即将迁移到它的项目。越来越多的公司更喜欢使用 Graphql 数据查询语法,如今它已成为必备知识。

GraphQL 是一种查询类型的 API 语言,广泛用于优化主机中从服务器端向客户端请求数据。客户使用类型化模式准确地请求他们需要的东西。它允许您仅发送请求的内容,而不是固定的数据集。

阿波罗服务器 为您提供发送响应客户端请求的工具。 Apollo Client 提供了使用 Graphql API 的能力,包括缓存和链接。

它是关于什么的?

我们将创建两个 Apollo 服务器来处理 Graphql 模式合并。这是一些外部服务器使用 Graphql API 响应而其他一些服务使用自己的 GraphQL 模式(包括外部模式)的情况。在 Node 层,我们将把来自外部服务器的结果包装在一个模式中,并将其发送给客户端。从字面上看,我们只需将两个模式合并为一个并将其发送给客户端。

让我们深入研究代码

对于实现,我们将使用 Node JS 环境、Koa 中间件和带有 GraphQL 工具的 Apollo Server。

我们必须运行两台服务器。两者都必须有一个 GraphQL Apollo 服务器。这是图表。

Diagram Schemas Merge

Diagram Schemas Merge

是时候创建样板文件并同时运行它们了。为此,我们需要创建两个文件夹并将一个文件夹命名为: 样板-raphql-koa-server-external 第二个文件夹就像这样: 样板-graphql-koa-server

在开始之前,请查看两个项目中的文件夹结构。很简单。这两个存储库之间的区别将在代码中。

 ├── package.json  
 └── 源  
 ├── index.js  
 ├── 解析器.js  
 └── schema.js

外部 GraphQL 服务器

现在,让我们设置 样板-graphql-koa-server-external

package.json for boilerplate-graphql-koa-server-external

然后让我们自己创建服务器。在里面 源代码 文件夹中 index.js 添加服务器设置:

index.js for boilerplate-graphql-koa-server-external

异步函数 服务器 将处理 koa 应用程序本身,我们将使用可执行模式创建 apollo 服务器,我们必须提供来自模式和解析器的类型。来自 官方文档 ,我们必须调用 apopServer.start() 之前提前 apolloServer.applyMiddleware .它允许识别潜在问题并在 Apollo Server 启动过程中崩溃的情况下采取行动,而不是开始服务请求。

第二部分是 样板-graphql-koa-server-external 让我们设置架构和解析器。

schema.js for boilerplate-graphql-koa-server-external

架构的解析器。

resolvers.js for boilerplate-graphql-koa-server-external

现在是时候检查服务器响应了。在此之前不要忘记安装软件包: 高于海平面和 然后运行命令 npm 运行开始 并在 Chrome 浏览器中输入 URL:[ http://localhost:4000/api/v1/graphql](http://localhost:4000/api/v1/graphql.) .点击“Query your server”按钮,就可以得到apollographql的界面了。它允许您从服务器查看请求的模式。打开 内省模式 页。您将在那里看到我们的架构:

Introspection Schema View at Apollo GraphQL Studio

Introspection Schema View at Apollo GraphQL Studio

如果您能够自省模式,那么这意味着我们已经完成了我们的 样板-graphql-koa-server-external

用于合并模式的 GraphQL 服务器

现在让我们移动到 样板-graphql-koa-server 设置。几乎所有东西都一样 包.json 外部的 但有额外的包和不同的 港口 ,名称和描述。

package.json for boilerplate-graphql-koa-server

让我们立即设置新模式。架构中有几乎相同但略有不同的数据。

schema.json for boilerplate-graphql-koa-server

和解析器:

resolvers.js for boilerplate-graphql-koa-server

现在让我们看一下服务器文件。您会发现除了几行代码之外,它是相对相同的。首先,我们采取了 加载计划 为了通过请求获取外部模式 EXTERNAL_ENDPOINT 这是我们第一个启动的服务器和模式的加载器 网址加载器 .

最重要的是我们必须确保我们的模式已经加载并且外部服务器不会抛出任何错误。我们必须抓住这种情况。正如您在代码中看到的,我们只得到了一个模式数组。默认情况下,我们只有自己的 内部架构 然后,如果外部服务器可用,我们将推送到该阵列 外部架构 然后使用该工具 合并模式 这有助于为 阿波罗服务器

Apollo Server setup with merging schemas

安装所有软件包并运行服务器,这将在 端口=3000 .让我们转到 apollographql 的相同界面,但 URL 必须使用正确的 PORT:[ http://localhost:3000/api/v1/graphql](http://localhost:4000/api/v1/graphql.) .现在如果我们打开 内省模式 页面我们将能够看到合并的模式。一个来自外部,另一个来自最后创建的服务器。

Introspection Schema View at Apollo GraphQL Studio

Introspection Schema View at Apollo GraphQL Studio

请记住,如果您的某些服务器将获得相同的字段,则 GraphQL 服务器将出现错误,如下所示:

 错误:无法合并 GraphQL 类型“Query”:字段“getFakeDataExample”已使用不同类型定义。声明为“DataExample”,但您尝试使用“DataExternalExample”覆盖

这意味着我们在 GraphQL 模式中必须非常小心我们的字段和类型定义,以免在类型或字段已经存在时陷入尴尬的境地。

GitHub 回购
https://github.com/antonkalik/boilerplate-graphql-koa-server
https://github.com/antonkalik/boilerplate-graphql-koa-server-external

模式加载文档
https://www.graphql-tools.com/docs/schema-loading

结论

许多公司正在转向微服务架构,并试图隔离数据流动的逻辑。我上面描述的这种方法适用于公司中微服务之间的这种通信情况,当存在某种具有默认模式的全局服务和具有将来将由客户端使用的附加字段的小型微服务时。

感谢您的关注。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/2912/39283108

posted @   哈哈哈来了啊啊啊  阅读(194)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示