GraphQL 是一种由 Facebook 开发的用于 API 的查询语言和运行时环境。它可以让客户端精确地指定它需要的数据,从而避免了传统 REST API 中的过度获取或者不足获取的问题。而 Apollo-Server 则是一个基于 Express 的 GraphQL 服务器,它提供了一种简单、快速和灵活的方式来构建 GraphQL 服务器。
安装
安装 Apollo-Server 很简单,只需要使用 npm 或者 yarn 安装即可:
npm install apollo-server-express
或者
yarn add apollo-server-express
使用
在使用 Apollo-Server 之前,我们需要先创建一个 Express 应用程序。在这里,我们将使用 Express 的 createApplication
函数来创建一个应用程序:
const express = require('express'); const app = express();
接下来,我们需要创建一个 GraphQL 服务器。在这里,我们将使用 Apollo-Server 的 ApolloServer
构造函数来创建一个服务器:
const { ApolloServer } = require('apollo-server-express'); const server = new ApolloServer({ typeDefs, resolvers, });
在这里,typeDefs
是一个包含 GraphQL schema 的字符串,而 resolvers
则是一个包含 resolver 函数的对象。我们稍后会详细讨论这两个对象。
最后,我们需要将 Apollo-Server 添加到 Express 应用程序中:
server.applyMiddleware({ app });
现在,我们已经创建了一个基于 Express 的 GraphQL 服务器。完整的代码如下:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - ------------- --- - - --------------------------------- ----- --- - ---------- ----- -------- - ---- ---- ----- - ------ ------ - -- ----- --------- - - ------ - ------ -- -- ------ -------- -- -- ----- ------ - --- -------------- --------- ---------- --- ------------------------ --- --- ------------ ----- ---- -- -- -- ------------------- ----- -- -------------------------------------------- --
现在,我们可以在浏览器中访问 http://localhost:4000/graphql
来测试我们的 GraphQL 服务器了。
Schema
GraphQL schema 定义了服务器支持的数据类型和查询。在 Apollo-Server 中,我们可以使用 gql
函数来定义 schema。
const { gql } = require('apollo-server-express'); const typeDefs = gql` type Query { hello: String } `;
在这里,我们定义了一个名为 Query
的对象,它包含一个名为 hello
的字段,类型为 String
。Query
对象是 GraphQL schema 的根对象,它定义了可以在服务器上进行的所有查询。
Resolvers
Resolver 函数是用于解析查询的函数。在 Apollo-Server 中,我们可以使用一个包含 resolver 函数的对象来定义 resolver。
const resolvers = { Query: { hello: () => 'Hello world!', }, };
在这里,我们定义了一个名为 hello
的 resolver 函数。它返回了一个字符串 Hello world!
。
我们可以定义多个 resolver 函数来处理不同的查询。例如:
const resolvers = { Query: { hello: () => 'Hello world!', greeting: (_, { name }) => `Hello ${name}!`, }, };
在这里,我们定义了一个名为 greeting
的 resolver 函数,它接受一个名为 name
的参数,并返回一个字符串 Hello ${name}!
。
数据源
在实际开发中,我们通常需要从数据库或者其他数据源中获取数据。在 Apollo-Server 中,我们可以使用数据源来处理这些数据源。
-- -------------------- ---- ------- ----- - -------------- - - ---------------------------------- ----- ----- ------- -------------- - ------------- - -------- ------------ - --------------------------- - ----- ------------- - ------ ---------------------- - -
在这里,我们定义了一个名为 MyAPI
的数据源,它继承自 RESTDataSource
类。我们可以在 MyAPI
中定义一些方法来获取数据。
指令
指令是一种可选的 GraphQL 扩展,它可以用来控制查询的行为。在 Apollo-Server 中,我们可以使用 @directive
语法来定义指令。
-- -------------------- ---- ------- ----- -------- - ---- ---- ----- - ------ ------ ---------- - --------- ---------- -- ---------------- -- ----- --------- - - ------ - ------ -- -- ------ -------- -- -- ----- ---------------- - - ---------- ------------------- -- ----- ------ - --- -------------- --------- ---------- ----------------- ---
在这里,我们定义了一个名为 uppercase
的指令,并将它添加到了 hello
字段上。schemaDirectives
对象是一个包含指令解析器的对象。
鉴权
在实际开发中,我们通常需要对查询进行鉴权。在 Apollo-Server 中,我们可以使用中间件来处理鉴权。
-- -------------------- ---- ------- ----- ------ - --- -------------- --------- ---------- -------- -- --- -- -- - ----- ---- - ----------------------------------- ------ - ---- -- -- --- ------------- ---- ----- -- - ----- ----- - -------------------------- -- ------- - --- - ----- - ---- - - ----------------- -------- -------- - ----- - ----- --- - ----------------- - - ------- ---
在这里,我们使用了 Express 中间件来验证用户的身份。context
函数用于将用户信息添加到 resolver 中。
结论
Apollo-Server 提供了一种简单、快速和灵活的方式来构建 GraphQL 服务器。通过使用 Apollo-Server,我们可以轻松地定义 schema、resolver 和数据源,并处理鉴权和指令等问题。希望这篇文章能够帮助你更好地理解 Apollo-Server 的使用方法。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/675eab10e49b4d0716192786