GraphQL是一种用于API开发的查询语言和运行时环境。它允许您描述应用程序中的数据要求,并定义API端点以响应这些请求。借助GraphQL,您可以将不同数据源的信息聚合在一起,将多个REST请求组合为单个查询,并减少在客户端和服务器之间传输的冗余数据。
在本文中,我们将探讨如何使用GraphQL编程框架快速开发GraphQL应用。我们将涵盖以下内容:
- GraphQL的基础知识
- GraphQL编程框架的使用
- 如何创建GraphQL应用
- GraphQL的高级功能
GraphQL基础知识
在开始深入探讨GraphQL编程框架之前,让我们先了解一些GraphQL的基础知识。
查询和变更
GraphQL支持两种类型的操作:查询和变更。查询用于检索数据,变更用于更改数据。
例如,以下是一个查询,用于检索所有用户的名称和电子邮件地址:
query GetUsers { users { name email } }
以下是一个变更,用于创建新用户并返回其ID:
mutation CreateUser { createUser(name: "Alice", email: "alice@example.com") { id } }
类型系统
GraphQL使用类型系统来定义查询和变更的输入和输出。每个GraphQL服务都有一个类型定义,其中包含类型和字段的列表。这些类型和字段定义了API可以查询和更改的数据。
以下是一个使用GraphQL SDL(Schema Definition Language)编写的示例类型定义:
-- -------------------- ---- ------- ---- ----- - ------ ------- -------- ----- ---- - ---- -------- - ---------------- -------- ------ --------- ----- - ---- ---- - --- --- ----- ------- ------ ------- -
此类型定义定义了三个类型:Query
,Mutation
和User
。Query
类型定义了users
和user
字段,分别用于检索所有用户和根据ID检索单个用户。Mutation
类型定义了createUser
字段,用于创建新用户。User
类型定义了用户的属性,包括ID,名称和电子邮件地址。
解析器
GraphQL请求由解析器处理。解析器负责确定如何执行给定查询或变更的数据检索和更改。解析器解析查询和变更,并执行相应的操作。
例如,在上面示例的类型定义中,让我们看一下Query
类型的users
字段。users
字段通过users
解析器执行,该解析器从数据库中检索所有用户并将它们作为结果返回。类似地,Mutation
类型的createUser
字段使用createUser
解析器将新用户插入到数据库中。
GraphQL编程框架的使用
现在我们已经了解了GraphQL的一些基础知识,让我们看一下如何使用GraphQL编程框架来快速开发GraphQL应用。
选择GraphQL编程框架
GraphQL编程框架有许多选择,包括Apollo Server,graphql-yoga和Prisma。这些框架提供了许多功能,例如自动创建GraphQL类型,运行时验证和请求缓存。选择最适合您的应用程序的框架。
在本文中,我们将使用Apollo Server。
安装和配置Apollo Server
安装Apollo Server:
npm install apollo-server graphql
配置Apollo Server来使用我们之前定义的类型定义:
-- -------------------- ---- ------- ----- - ------------- --- - - ------------------------- ----- -------- - ---- ---- ----- - ------ ------- -------- ----- ---- - ---- -------- - ---------------- -------- ------ --------- ----- - ---- ---- - --- --- ----- ------- ------ ------- - -- ----- --------- - - ------ - ------ -- -- ------ ----- -------- - -- -- -- --------------- -- ------- --- ---- -- --------- - ----------- -------- - ----- ----- -- -- - ----- ---- - - --- ------------------- - --- ----- ----- -- ----------------- ------ ----- -- -- -- ----- ------ - --- -------------- --------- --------- --- ----------------------- --- -- -- - ------------------- ----- -- --------- ---
这将创建一个GraphQL服务,该服务使用我们之前定义的类型和解析器来执行查询和变更。
运行GraphQL查询
现在,让我们尝试使用GraphQL编程框架运行查询。在浏览器中访问http://localhost:4000
,可以使用GraphQL Playground交互式地发送查询。
例如,以下查询将检索所有用户的名称和电子邮件地址:
{ users { name email } }
Click the Run button and you should see a response with the names and email addresses of all users.
我们还可以运行变更以创建新用户:
mutation { createUser(name: "Alice", email: "alice@example.com") { id name email } }
Click the Run button and you should see a response with the ID, name, and email address of the new user.
GraphQL的高级功能
现在我们已经完成了一个基本的GraphQL应用程序,让我们看看一些高级功能。
数据加载器
数据加载器是一种用于GraphQL服务的性能优化技术。它允许您批量检索数据并在请求期间缓存数据。例如,如果您在查询中多次请求相同的数据,数据加载器将从缓存中返回数据,而不是再次检索数据。
以下是使用数据加载程序的示例类型定义:
-- -------------------- ---- ------- ---- ----- - -------- ----- ---- - ---- ---- - --- --- ----- ------- ------ ------- ------ ------- - ---- ---- - --- --- ------ ------- -------- ------- -
以下是使用数据加载程序的示例解析器:
-- -------------------- ---- ------- ----- ---------- - ---------------------- ----- ----------- - --- ---------------- --------- -- - ----- ----- - ----- ----------------------------- --------- - ---- ------- - ------------- ----- ----------- - ------------------ -- ----------------- -- ------------- --- --------- ------ ------------ --- ----- --------- - - ------ - ----- -------- - -- -- -- --------------- -- ------- --- ---- -- ----- - ------ -------- -- ---------------------------- -- --
这里,我们使用了dataloader
模块创建了一个数据加载器,该模块将所有用户的ID作为输入,并返回每个用户的帖子列表。
在User
类型的posts
字段解析器中,我们使用数据加载器来获取用户的帖子。将用户的ID传递给数据加载器,数据加载器将检索缓存中的帖子列表。如果在缓存中找不到帖子,则数据加载器将从数据库中检索帖子,并将其添加到缓存中。
订阅和实时数据
GraphQL还支持实时数据的推送。使用GraphQL Subscriptions,您可以在服务器端推送数据,并使用Websockets在客户端实时接收数据。
以下是使用GraphQL Subscriptions的示例类型定义:
-- -------------------- ---- ------- ---- ----- - -------- ----- ---- - ---- ------------ - -------- ---- - ---- ---- - --- --- ----- ------- ------ ------- - ---- -------- - ---------------- -------- ------ --------- ----- -
这里,我们定义了一个名为newUser
的新订阅,该订阅在服务器端有新用户被创建时返回该用户。
以下是使用GraphQL Subscriptions的示例代码:
-- -------------------- ---- ------- ----- - ------------- ---- ------ - - ------------------------- ----- ------ - --- --------- ----- -------- - ---- ---- ----- - -------- ----- ---- - ---- ------------ - -------- ---- - ---- ---- - --- --- ----- ------- ------ ------- - ---- -------- - ---------------- -------- ------ --------- ----- - -- ----- --------- - - ------ - ----- -------- - -- -- -- --------------- -- ------- --- ---- -- ------------- - -------- - ---------- -- -- ----------------------------------- -- -- --------- - ----------- -------- - ----- ----- -- -- - ----- ---- - - --- ------------------- - --- ----- ----- -- ----------------- -------------------------- - -------- ---- --- ------ ----- -- -- -- ----- ------ - --- -------------- --------- --------- --- ----------------------- --- -- -- - ------------------- ----- -- --------- ---
这里,我们使用PubSub
模块创建一个新的发布/订阅实例。在createUser
变更解析器中,我们向发布中心发布新用户事件。在newUser
订阅解析器中,我们创建一个新的订阅器并从发布中心订阅NEW_USER
事件。
现在,在客户端上,您可以使用Websockets订阅一个名为newUser
的新订阅,以接收实时用户数据:
-- -------------------- ---- ------- ----- ------ - ---------------------- ----- ------ - --- -------------------------- - ---------- ----- --- ----- ----- - ---- ------------ - ------- - -- ---- ----- - - -- ---------------- ----- -------------- ----- ---- -- ------------------------- ------ ------ ---
这将在客户端上打印所有新用户。每当在服务器端创建新用户时,此订阅将自动更新以显示新用户的数据。
结论
GraphQL编程框架是快速开发GraphQL应用程序的有用工具。它为开发人员提供了许多便利功能,并使开发人员能够更轻松地构建客户端和服务器之间的交互。在本文中,我们从GraphQL的基础知识开始,了解了GraphQL编程框架的使用,并介绍了一些高级功能。我们希望本文对您有所帮助,并希望您可以尝试使用GraphQL编程框架构建您自己的GraphQL应用程序。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/672360022e7021665e0fcf19