Apollo-Server:基于 Express 的 GraphQL 服务器详解

阅读时长 7 分钟读完

GraphQL 是一种由 Facebook 开发的用于 API 的查询语言和运行时环境。它可以让客户端精确地指定它需要的数据,从而避免了传统 REST API 中的过度获取或者不足获取的问题。而 Apollo-Server 则是一个基于 Express 的 GraphQL 服务器,它提供了一种简单、快速和灵活的方式来构建 GraphQL 服务器。

安装

安装 Apollo-Server 很简单,只需要使用 npm 或者 yarn 安装即可:

或者

使用

在使用 Apollo-Server 之前,我们需要先创建一个 Express 应用程序。在这里,我们将使用 Express 的 createApplication 函数来创建一个应用程序:

接下来,我们需要创建一个 GraphQL 服务器。在这里,我们将使用 Apollo-Server 的 ApolloServer 构造函数来创建一个服务器:

在这里,typeDefs 是一个包含 GraphQL schema 的字符串,而 resolvers 则是一个包含 resolver 函数的对象。我们稍后会详细讨论这两个对象。

最后,我们需要将 Apollo-Server 添加到 Express 应用程序中:

现在,我们已经创建了一个基于 Express 的 GraphQL 服务器。完整的代码如下:

-- -------------------- ---- -------
----- ------- - -------------------
----- - ------------- --- - - ---------------------------------

----- --- - ----------

----- -------- - ----
  ---- ----- -
    ------ ------
  -
--

----- --------- - -
  ------ -
    ------ -- -- ------ --------
  --
--

----- ------ - --- --------------
  ---------
  ----------
---

------------------------ --- ---

------------ ----- ---- -- -- --
  ------------------- ----- -- --------------------------------------------
--

现在,我们可以在浏览器中访问 http://localhost:4000/graphql 来测试我们的 GraphQL 服务器了。

Schema

GraphQL schema 定义了服务器支持的数据类型和查询。在 Apollo-Server 中,我们可以使用 gql 函数来定义 schema。

在这里,我们定义了一个名为 Query 的对象,它包含一个名为 hello 的字段,类型为 StringQuery 对象是 GraphQL schema 的根对象,它定义了可以在服务器上进行的所有查询。

Resolvers

Resolver 函数是用于解析查询的函数。在 Apollo-Server 中,我们可以使用一个包含 resolver 函数的对象来定义 resolver。

在这里,我们定义了一个名为 hello 的 resolver 函数。它返回了一个字符串 Hello world!

我们可以定义多个 resolver 函数来处理不同的查询。例如:

在这里,我们定义了一个名为 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

纠错
反馈