使用 JavaScript 实现 GraphQL 订阅以实现实时数据更新

javascriptweb developmentfront end technology

在当今快节奏的世界中,实时数据更新对于现代 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 模式。我们定义一个带有 id、title 和 content 字段的 Post 类型。此外,我们定义一个用于检索帖子的 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 字段的查询解析器返回 posts 数组。createPost 的 Mutation 解析器将新帖子添加到 posts 数组并返回新创建的帖子。最后,newPost 的订阅解析器设置订阅并使用 pubsub 对象异步监听新帖子。

配置服务器

现在,让我们在名为 server.js 的新文件中配置 Apollo 服务器 −

// 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 导入必要的依赖项以及我们之前创建的架构和解析器文件。我们从 Apollo Server 实例化一个 PubSub 对象来处理订阅所需的发布-订阅功能。然后,我们使用包含 pubsub 对象的架构、解析器和上下文配置 Apollo Server。最后,我们启动服务器并记录其运行的 URL。

测试 GraphQL 订阅

订阅新帖子 −

在服务器运行时,打开一个新终端并使用 GraphiQL 或 Apollo Client 等 GraphQL 客户端执行以下订阅查询:

subscription {
   newPost {
      id
      title
      content
   }
}

解释

此订阅查询设置订阅以监听新帖子。它请求新帖子的 id、title 和 content 字段。

发布新帖子

现在,在另一个终端中,执行以下变更以发布新帖子 −

示例

mutation {
   createPost(title: "Hello, World!", content: "This is my first post.")
   {
      id
      title
      content
   }
}

解释

此突变创建了一篇新帖子,标题为"Hello, World!",内容为"这是我的第一篇帖子"。突变返回新创建帖子的 id、title 和 content 字段。

输出

执行突变后,您应该会看到新创建的帖子被发送到订阅选项卡。订阅选项卡中的输出将如下所示 -

{
   "data": {
      "newPost": {
         "id": "1",
         "title": "Hello, World!",
         "content": "This is my first post."
      }
   }
}

结论

在本文中,我们探讨了如何在 JavaScript 中实现 GraphQL 订阅。我们讨论了实时数据更新的重要性,使用 Apollo Server 设置了 GraphQL 服务器,并演示了如何定义架构、解析器和订阅。通过遵循提供的步骤,您可以将 GraphQL 订阅集成到 JavaScript 应用程序中并启用实时功能以改善用户体验。


相关文章