GraphQL 中的 QueryResolver 与 DataFetcher 的区别与使用方法

阅读时长 8 分钟读完

GraphQL 是一种用于构建 API 的查询语言和运行时环境。在 GraphQL 中,QueryResolver 和 DataFetcher 是两个核心概念。然而,它们具有不同的作用和使用方法。在本文中,我们将深入理解 QueryResolver 和 DataFetcher 的区别和使用方法。

QueryResolver

QueryResolver 是一个接口,用于定义 GraphQL 查询的解析逻辑。它是用来处理查询请求,从数据库或 REST API 等外部源获取数据,并根据图形查询语句返回数据。

QueryResolver 的工作方式类似于 REST API 中的控制器(Controller)。它接收查询请求,将其解析为由模型组成的对象类型,并返回数据。

使用 QueryResolver 需要按照 GraphQL Schema 中定义的格式实现它。例如,假设我们有以下 GraphQL Schema:

如果要实现 QueryResolver,需要创建一个类,并定义一个同名方法 user。该方法应该返回用户对象。

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

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

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

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

在上面的代码中,我们使用 Spring Boot 框架作为例子。UserQueryResolver 类通过 userRepository 在数据库中查找用户对象并返回。

DataFetcher

DataFetcher 是用于从外部资源获取数据的工具类。在 GraphQL Schema 中,每个字段都对应着一个 DataFetcher。当对该字段进行查询时,将调用 DataFetcher 尝试获取所需的数据。

与之前的例子不同,使用 DataFetcher 需要手动写逻辑代码,并直接与外部业务层交互。例如,假设我们有以下 GraphQL Schema:

如果要实现 DataFetcher,那么我们需要手动编写数据获取和处理的代码:

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

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

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

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

在上面的代码中,我们从输入参数中获取 id,并通过 userService 对业务层进行调用。在这种情况下,DataFetcher 类直接与业务逻辑层进行交互,而不是在 QueryResolver 中编写代码。

区别与使用

现在,我们已经了解了 QueryResolver 和 DataFetcher 的区别,接下来我们将看到它们的一些使用方法。

在实际开发中,QueryResolver 和 DataFetcher 经常被结合使用。例如,我们通常使用 QueryResolver 处理指向数据库的查询操作,使用 DataFetcher 处理来自 REST API 的请求。

假设我们有以下 GraphQL Schema:

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

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

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

现在,我们将创建一个示例应用程序,该应用程序使用 QueryResolver 处理 user 查询,使用 DataFetcher 处理 weather 查询。

首先,我们在 QueryResolver 中实现 user 方法:

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

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

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

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

然后,我们创建一个名为 WeatherDataFetcher 的接口,该接口实现 DataFetcher 接口。该接口将实现 get 方法,用于从外部 API 中获取天气数据。最后,我们在 QueryResolver 中注入 WeatherDataFetcher,并将 weather 方法转发给它:

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

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

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

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

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

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

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

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

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

在上面的示例中,我们可以看到 QueryResolver 和 DataFetcher 的协同工作方式。QueryResolver 处理 user 查询,而 weather 查询则由 DataFetcher 处理。

结论

在本文中,我们已经了解了 QueryResolver 和 DataFetcher 的区别和使用方法。QueryResolver 主要用于处理查询逻辑,如从数据库中获取数据。DataFetcher 则用于从外部数据源获取数据。在实际开发中,两种方法往往是结合起来使用的,以实现 GraphQL API 的完全功能。如果您要使用 GraphQL 进行应用程序开发,请始终牢记 QueryResolver 和 DataFetcher 的区别。

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

纠错
反馈