在JavaScript中实现GraphQL订阅以进行实时数据更新
在当今快节奏的世界中,实时数据更新对于现代 Web 应用程序变得越来越重要。实现实时功能的一种流行解决方案是 GraphQL 订阅。在本文中,我们将探讨如何在 JavaScript 中实现 GraphQL 订阅,提供代码示例、解释以及对该主题的全面理解。
了解 GraphQL 订阅
GraphQL 是一种用于 API 的开源查询语言,以及一个用于使用现有数据执行这些查询的运行时环境。它允许客户端向服务器请求特定数据,从而实现客户端和服务器之间高效且灵活的通信。虽然 GraphQL 查询和突变用于检索和操作数据,但 GraphQL 订阅通过在客户端和服务器之间建立持久连接来实现实时数据更新。
设置环境
首先,我们需要一个 JavaScript 环境和一个 GraphQL 服务器。出于本文的目的,我们将使用 Node.js 和 Apollo Server 库,它是用 JavaScript 构建 GraphQL 服务器的流行选择。在继续之前,请确保已安装 Node.js。
安装依赖项
让我们创建一个新项目并安装必要的依赖项 -
mkdir graphql-subscriptions cd graphql-subscriptions npm init -y npm install apollo-server graphql
说明
在此步骤中,我们设置项目目录并使用 npm 初始化一个新项目。然后,我们安装所需的依赖项,包括 Apollo Server 和 GraphQL 库。
定义模式
接下来,让我们创建一个名为 schema.js 的文件并定义一个简单的 GraphQL 模式 -
// schema.js
const { gql } = require('apollo-server');
const typeDefs = gql`
type Post {
id: ID!
title: String!
content: String!
}
type Query {
posts: [Post!]!
}
type Mutation {
createPost(title: String!, content: String!): Post!
}
type Subscription {
newPost: Post!
}
`;
module.exports = typeDefs;
说明
在此代码片段中,我们从 Apollo Server 导入必要的依赖项,并使用 gql 标记定义我们的 GraphQL 模式。我们定义了一个 Post 类型,其中包含 id、title 和 content 字段。此外,我们定义了一个 Query 类型用于检索帖子,一个 Mutation 类型用于创建帖子,以及一个 Subscription 类型用于接收新帖子的实时更新。
实现 GraphQL 订阅
有了模式,现在让我们为 Query、Mutation 和 Subscription 类型实现解析器函数。
在此示例中,我们将使用内存数组来存储帖子。
创建解析器
在名为 resolvers.js 的新文件中,添加以下代码 -
// resolvers.js
const posts = [];
const resolvers = {
Query: {
posts: () => posts,
},
Mutation: {
createPost: (_, { title, content }) => {
const newPost = { id: posts.length + 1, title, content };
posts.push(newPost);
return newPost;
},
},
Subscription: {
newPost: {
subscribe: (_, __, { pubsub }) => pubsub.asyncIterator('NEW_POST'),
},
},
};
module.exports = resolvers;
说明
在此代码片段中,我们为不同的 GraphQL 类型定义解析器函数。posts 字段的 Query 解析器返回 posts 数组。createPost 的 Mutation 解析器将新帖子添加到 posts 数组并返回新创建的帖子。最后,newPost 的 Subscription 解析器设置订阅并使用 pubsub 对象异步监听新帖子。
配置服务器
现在,让我们在一个名为 server.js 的新文件中配置 Apollo Server -
// server.js
const { ApolloServer, PubSub } = require('apollo-server');
const typeDefs = require('./schema');
const resolvers = require('./resolvers');
const pubsub = new PubSub();
const server = new ApolloServer({
typeDefs,
resolvers,
context: () => ({ pubsub }),
});
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}`);
});
说明
在此代码片段中,我们从 Apollo Server 以及我们之前创建的 schema 和 resolver 文件导入必要的依赖项。我们从 Apollo Server 实例化一个 PubSub 对象来处理订阅所需的发布-订阅功能。然后,我们使用 schema、resolvers 和包含 pubsub 对象的上下文配置 Apollo Server。最后,我们启动服务器并记录其运行的 URL。
测试 GraphQL 订阅
订阅新帖子 -
服务器运行后,打开一个新终端并使用 GraphQL 客户端(如 GraphiQL 或 Apollo Client)执行以下订阅查询
subscription {
newPost {
id
title
content
}
}
说明
此订阅查询设置一个订阅以监听新帖子。它请求新帖子的 id、title 和 content 字段。
发布新帖子
现在,在另一个终端中,执行以下突变以发布新帖子 -
示例
mutation {
createPost(title: "Hello, World!", content: "This is my first post.")
{
id
title
content
}
}
说明
此突变创建一个新的帖子,标题为“Hello, World!”,内容为“This is my first post.”。该突变返回新创建帖子的 id、title 和 content 字段。
输出
执行突变后,您应该会看到新创建的帖子被发送到订阅选项卡。订阅选项卡中的输出将如下所示 -
{
"data": {
"newPost": {
"id": "1",
"title": "Hello, World!",
"content": "This is my first post."
}
}
}
结论
在本文中,我们探讨了如何在 JavaScript 中实现 GraphQL 订阅。我们讨论了实时数据更新的重要性,使用 Apollo Server 设置了 GraphQL 服务器,并演示了如何定义模式、解析器和订阅。通过遵循提供的步骤,您可以将 GraphQL 订阅集成到您的 JavaScript 应用程序中,并为改进的用户体验启用实时功能。
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP