首页 > 其他分享 >使用 Apollo Server 和 Koa 合并 GraphQL Schema

使用 Apollo Server 和 Koa 合并 GraphQL Schema

时间:2022-08-31 08:44:21浏览次数:95  
标签:Koa 模式 server koa graphql 服务器 GraphQL Server

使用 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

标签:Koa,模式,server,koa,graphql,服务器,GraphQL,Server
From: https://www.cnblogs.com/amboke/p/16641690.html

相关文章

  • [Bug0046] 记录一次Windows Server 2012 R2启动徽标后黑屏排查修复过程
    1、问题WindowsServer2012R2启动徽标后黑屏2、场景装完服务器系统后,有位同事为了方便更新驱动下载了360驱动进行驱动更新。更新后第二天重启服务器黑屏。3、排查过......
  • sql server 如何根据某列不同值执行更新语句更新为新值
    需求:现有一张表如下需要讲levels里的值根据A,B,C,D替换成重大隐患,一般隐患A,一般隐患B,一般隐患C执行方法如下,使用casewhenthenend配合执行语句达到目标updateKnow......
  • MockServer 服务框架设计
    ⬇️点击“下方链接”,提升测试核心竞争力!>>更多技术文章分享和免费资料领取大部分现有的mock工具只能满足HTTP协议下简单业务场景的使用。但是面对一些复杂的业务场景......
  • SqlServer数据同步
    SqlServer数据同步刘茂同永不匿名​关注他 1人赞同了该文章一、项目需求1.数据库同步实现两个Sqlserver之间的数据库同步对实时性有较......
  • sqlserver with as
    witht1as(selectIdfromdbo.[ECR_ProvidentPayment]orderby[Id]offset1rowsfetchnext10rowsonly)selectt1.*fromt1;withaas(selectIdfrom......
  • Zabbix Server 安装 6.0
    先安装MySQL8.0,方法如下:https://www.cnblogs.com/Magiclala/p/16638781.html然后登录数据库,配置一个用户zabbix,设置密码为password,并配置本地登录权限sudomysql-uroot......
  • [ROS学习]10. 服务端Server的编程实现
    参考笔记:【ROS学习笔记】10.服务端Server的编程实现内容参考:基于B站ROS公开课:【古月居】古月·ROS入门21讲基于Ubuntu20.04.1、Noetic版本本节说明上一讲学习了基于Ser......
  • SQL Server 错误:找不到SQL Server Configuration Manager配置管理工具
    问题描述:SQLServer配置管理器可用来管理与SQLServer相关联的服务、配置SQLServer使用的网络协议以及从SQLServer客户端计算机管理网络连接配置。但是升级到win11......
  • SQL Server 错误:无法连接到本地服务器
    问题描述:在与SQLServer建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且SQLServer已配置为允许远程连接。prov......
  • SQL Server教程 - SSMS(SQL Server Management System)
    更新记录转载请注明出处。2022年8月30日发布。2022年8月30日从笔记迁移到博客。SSMS(SQLServerManagementSystem)说明可视化的SQLServer管理工具SQLServerM......