GraphQL 是一种用于构建 API 的查询语言和运行时环境。在 GraphQL 中,QueryResolver 和 DataFetcher 是两个核心概念。然而,它们具有不同的作用和使用方法。在本文中,我们将深入理解 QueryResolver 和 DataFetcher 的区别和使用方法。
QueryResolver
QueryResolver 是一个接口,用于定义 GraphQL 查询的解析逻辑。它是用来处理查询请求,从数据库或 REST API 等外部源获取数据,并根据图形查询语句返回数据。
QueryResolver 的工作方式类似于 REST API 中的控制器(Controller)。它接收查询请求,将其解析为由模型组成的对象类型,并返回数据。
使用 QueryResolver 需要按照 GraphQL Schema 中定义的格式实现它。例如,假设我们有以下 GraphQL Schema:
type Query { user(id: Int!): User } type User { id: Int! name: String! }
如果要实现 QueryResolver,需要创建一个类,并定义一个同名方法 user。该方法应该返回用户对象。
-- -------------------- ---- ------- -------- ------ ----- ----------------- ---------- -------------------- - ------- ----- -------------- --------------- ------ -------------------------------- --------------- - ------------------- - --------------- - ------ ---- ------------ --- - ------ ----------------------------------------- - -
在上面的代码中,我们使用 Spring Boot 框架作为例子。UserQueryResolver 类通过 userRepository 在数据库中查找用户对象并返回。
DataFetcher
DataFetcher 是用于从外部资源获取数据的工具类。在 GraphQL Schema 中,每个字段都对应着一个 DataFetcher。当对该字段进行查询时,将调用 DataFetcher 尝试获取所需的数据。
与之前的例子不同,使用 DataFetcher 需要手动写逻辑代码,并直接与外部业务层交互。例如,假设我们有以下 GraphQL Schema:
type Query { user(id: Int!): User } type User { id: Int! name: String! }
如果要实现 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