npm 包 @graphql-tools/stitch 使用教程

阅读时长 9 分钟读完

GraphQL 是一种用于 API 的查询语言,它可以把多个数据源(如数据库、REST API 等)整合到一个 API 中,提供给前端开发人员调用。而 @graphql-tools/stitch 就是一个优秀的 npm 包,用于不同 GraphQL API 的整合,本文将为大家介绍它的使用方法。

为什么要使用 @graphql-tools/stitch?

在使用 GraphQL 进行服务端开发时,我们可能会遇到这样的情况:需要对不同的数据源进行查询,但是每个数据源对应的 Schema 是不同的,此时我们可以使用 @graphql-tools/stitch 来整合这些 Schema,从而减少代码的复杂度。

而且,@graphql-tools/stitch 还提供了对 Schema 的本地化和查询计划的缓存功能,从而加快了查询速度,减少了请求次数和网络带宽的消耗。

如何使用 @graphql-tools/stitch?

安装

使用 npm 进行安装:

准备工作

首先,我们需要准备好要整合的不同 Schema。本文为了方便演示,我们假设有 2 个 Schema,分别是 User 和 Order。

我们先定义 User 的 Schema:

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

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

然后定义 Order 的 Schema:

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

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

整合 Schema

接下来,我们将这两个 Schema 整合起来。首先,我们需要安装一下 graphql:

1、定义 Schema

我们在一个新的文件里定义整合后的 Schema:

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

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

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

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

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

这里,我们通过 extend 关键字,将 User 和 Order 这两个 Schema 合并到了一个新的 Schema 中。

需要注意的是,我们为 Stitch 定义了一个新的类型,用于处理不同 Schema 的整合。同时,我们为 User 和 Order 加上了新的字段,以便能够进行跨 Schema 的查询。

在这个新的 Schema 中,我们定义了查询接口 Query,包括了 users 和 orders 两个查询字段,以及一个 createUser 的 mutation 接口。

2、创建 Schema 和 Resolver

接下来,我们需要创建 Schema 和 Resolver。

首先,我们在一个新的文件里创建 Schema:

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

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

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

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

然后,我们在另一个文件中创建 Resolver:

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

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

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

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

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

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

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

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

这里,我们先将 User Schema 和 Order Schema 转换成可执行的远程 Schema,然后使用 stitchSchemas 将它们整合。接着,我们定义了 Query 和 Mutation 的 Resolver,用于实现查询和修改操作。

在 Resolver 中,我们将 Stitch 定义的类型映射到了对应的 Schema 中,并通过 delegateToSchema 方法来调用对应 Schema 的查询接口或 mutation 接口,从而实现了整合。

测试

最后,我们可以使用一个 GraphiQL 界面来测试我们的 wholeSchema,示例如下:

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

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

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

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

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

到这里,我们已经完成了整个代码的演示,大家可以根据自己的实际需求进行调整和修改。

总结

本文介绍了如何使用 @graphql-tools/stitch 来整合多个 GraphQL Schema,从而加快了查询速度、减少了请求次数和网络带宽的消耗。希望对大家有所帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/5eedc8a5b5cbfe1ea0612317

纠错
反馈