GraphQL 是一种用于应用程序的查询语言,GraphQL 能够让客户端定义数据的结构和内容,以及响应数据的结构和内容。
GraphQL 中的一个重要概念是数据更新。数据更新是指客户端发出数据更改请求时,服务器端如何响应并更新数据。在本文中,我们将深入探讨 GraphQL 中的数据更新及其相应的订阅实现。
GraphQL 中的数据更新
GraphQL 使用类型系统来定义数据结构,并使用查询语言来查询这些数据。在 GraphQL 中,查询和变异(mutations)是对数据的读取和写入操作。我们可以使用 GraphQL 的变异系统来更改数据,从而实现数据更新。
变异系统
变异系统是一个类型安全的方法,通过它我们可以更新数据库的数据。如下所示,这是 GraphQL 中用于创建用户的变异:
mutation createUser($name: String!, $email: String!) { createUser(name: $name, email: $email) { id name email } }
变异系统在查询语言的基础上添加了可写的操作,其中包括创建、更新和删除对象。
在 GraphQL 中,我们还可以通过其他方法来实现数据的更新:
- 自动更新
- 实时订阅
GraphQL 中的实时订阅
GraphQL 中的订阅是一种实现实时数据更新的方法,它与 REST API 不同,因为 REST API 是基于请求和响应的。GraphQL 提出了一种新的概念,即订阅,它允许客户端在发生数据更改时即时收到通知。
订阅的实现
订阅的实现包括两个步骤:
- 为每个订阅执行注册操作
- 当数据更改时,将其发送给与订阅相关的所有客户端
可以使用 GraphQL 的 subscribe()
函数来执行这些步骤。该函数将一个请求对象作为输入,并返回一个包含三个元素的对象:
asyncIterator
:一个异步迭代器,可用于将对订阅的事件流处理功能添加到for await...of
循环中。next
:一个与asyncIterator
类似的纯 JavaScript 事件流接口,可用于手动处理订阅事件流。return
:一个用于清理订阅的函数,将在终止与asyncIterator
的迭代时调用。
如下所示,这是一个可以按小时更新的价格变化的示例代码:
-- -------------------- ---- ------- ----- - ---- ------ - - ------------------------- ----- ------ - --- --------- ----- -------- - ---- ---- ----- - ----------- ----- ------- - ---- ------- - --- --- ----- ------- ------ ------ - ---- ------------ - ----------------- ----- -------- - -- ----- -------- - - - --- -- ----- -------- ------ ---- -- - --- -- ----- --------- ------ ---- -- -- ----- --------- - - ------ - -------- -------- ----- -------- ----- -- - ------ --------------------- -- ---------- --- --------- -- -- ------------- - -------------- - ---------- -------- - -- -- -- - ----- ---- - -------------- -------------- -- - ----- ------- - --------------------- -- ---------- --- ---- ----- -------- - ------------- - ---- -------------------- - -------------- - ----------- ------ -------- - --- -- ------ ------ --------------------------- -- -- -- -- -------------- - - --------- ---------- --
在这个示例中,我们使用了 setInterval()
函数来模拟价格变化并更新产品价格。每秒钟,价格更新后会发布一个事件,从而触发客户端上与订阅相关的回调函数。
代码的说明
这段代码包含以下内容:
pubsub
:PubSub 实例,用于处理订阅中的事件通知。typeDefs
:GraphQL schema,类型定义,包含可执行 Query 和 Subscription。resolvers
:处理查询和订阅的相关逻辑。
在 Subscription:productUpdate:subscribe
中,我们创建了一个发布-订阅通道来处理订阅。我们使用了 channel
变量,该变量是我们将要使用的逻辑 ID。
在这个示例中,我们使用 setInterval()
函数模拟数据更新。每秒钟,我们都会发送一个新的产品价格,而 pubsub.publish()
函数将发送新的数据给所有订阅了 chan
通道的客户端。
在客户端中,使用 GraphQL 和 WebSockets 技术,可以很容易地实现订阅和更新响应的数据。
结论
本文介绍了在 GraphQL 中实现数据更新的两种方法:变异和订阅。我们还介绍了如何使用 subscribe()
函数通过发送事件更新数据并将其发送给相关客户端来实现 GraphQL 中的实时订阅。
如果您是一名前端开发人员,学习 GraphQL 将赋予您各种处理数据库变更和通知客户端的工具。通过以上示例代码的指导,希望您深入了解 GraphQL 数据库形式的实现,提高编程能力并加强数据管理的同步与异步能力。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/674b95acd657e1f70db6c70c