在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 应用程序中,并为改进的用户体验启用实时功能。

更新于: 2023年7月25日

164 次查看

开启您的 职业生涯

通过完成课程获得认证

开始
广告