GraphQL 是一种用于 API 设计的查询语言和运行时环境。它可以帮助开发人员更容易地组织和请求数据,并提供了一个强大的查询系统。在本文中,我们将探讨如何创建一个现代 GraphQL 服务器。
什么是 GraphQL?
GraphQL 是一种查询语言,旨在为 API 提供更好的查询性能和灵活性。它允许客户端在单个请求中指定所需的数据,而不是使用多个 REST 请求来获取数据。
GraphQL 的编写方式和 REST 类似,但 GraphQL 表达的是数据模型和查询模型之间的映射关系。每个 GraphQL 应用程序都有一个类型定义,它描述了可用的数据类型和查询类型。
GraphQL 架构
GraphQL 架构分为三层:类型定义、查询和解析。
- 类型定义:定义允许查询的数据类型和查询类型。在类型定义中,我们会指定对象、接口、枚举和标量类型。
- 查询:GraphQL 提供了一种查询语言。客户端可以通过查询来请求需要的数据。查询由 GraphQL 操作语言(GraphQL Operation Language)编写而成,这是一种基于类型定义的查询语法。
- 解析:这是 GraphQL 服务器的核心功能。它用于解析客户端查询,并返回所请求的数据。
如何创建一个 GraphQL 服务器
下面是如何使用 Apollo Server 和 Express,创建一个基本的 GraphQL 服务器的几个步骤。
安装依赖项
首先,我们需要安装一些依赖项。
npm install apollo-server-express express graphql
创建服务器
在创建 GraphQL 服务器之前,我们需要创建一个 Express 服务器。
const express = require('express'); const app = express(); app.listen({ port: 4000 }, () => console.log(`🚀 Server ready at http://localhost:4000${server.graphqlPath}`) );
创建类型定义
现在,我们需要定义我们的数据类型和查询类型。我们可以使用 GraphQL schema 语言来定义类型。在这个例子中,我们创建了一个名为 Book 的类型,并定义了查询 Books 的方法。
-- -------------------- ---- ------- ----- - --- - - --------------------------------- ----- -------- - ---- ---- ---- - ------ ------ ------- ------ - ---- ----- - ------ ------ - --
创建解析器
现在我们需要实现我们的解析器。这些解析器会解析并处理我们查询的数据。
-- -------------------- ---- ------- ----- --------- - - ------ - ------ -- -- ------ -- -- ----- ----- - - - ------ ---- ----- -------- ------- --- ----- ------------ -- - ------ --- ---- - ------------- ------- ------- ----- -- --
合并服务器
现在我们需要将类型定义和解析器合并到服务器中。
const { ApolloServer } = require('apollo-server-express'); const server = new ApolloServer({ typeDefs, resolvers }); server.applyMiddleware({ app });
测试服务器
我们可以使用 GraphQL Playground 轻松测试我们的服务器。可以通过浏览器打开 http://localhost:4000/graphql 来访问。
现在我们可以查询 Book 类型和 books 查询类型。
{ books { title author } }
这就是如何创建一个简单的 GraphQL 服务器。
结论
GraphQL 是一个强大的 API 查询语言。本文介绍了如何使用 Apollo Server 和 Express 创建一个 GraphQL 服务器。虽然这个例子非常简单,但是它演示了如何定义数据类型、操作类型和解析器,并将它们合并为一个 GraphQL 服务器。现在你已经准备好为你的应用程序构建一个现代的 GraphQL 服务器了。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66f5e432c5c563ced57d2b44