推荐答案
GraphQL 解析器(Resolvers)是 GraphQL 查询执行过程中用于获取数据的函数。每个字段在 GraphQL 类型系统中都有一个对应的解析器,用于决定如何获取该字段的值。解析器的主要作用是将客户端请求的字段映射到实际的数据源(如数据库、API 等),并返回相应的数据。
解析器的基本用法是在 GraphQL 模式定义中为每个字段指定一个函数,该函数接收四个参数:
parent
:父字段的解析结果。args
:客户端传递的参数。context
:上下文对象,通常包含请求相关的信息(如用户身份、数据库连接等)。info
:包含查询的抽象语法树(AST)和其他元数据。
解析器可以返回同步值、Promise 或使用 async/await
语法返回异步值。
本题详细解读
解析器的作用
解析器是 GraphQL 查询执行的核心部分。当客户端发送一个 GraphQL 查询时,GraphQL 服务器会根据查询中的字段逐个调用对应的解析器,以获取每个字段的值。解析器负责从数据源中提取数据,并将其返回给客户端。
解析器的用法
在 GraphQL 模式定义中,解析器通常与类型定义一起使用。例如,假设有一个 User
类型和一个 Query
类型:
-- -------------------- ---- ------- ---- ---- - --- --- ----- ------- ------ ------- - ---- ----- - -------- ----- ---- -
对应的解析器可能如下所示:
-- -------------------- ---- ------- ----- --------- - - ------ - ----- -------- ----- -------- ----- -- - -- -- ------- ----------------- ------ --------------------------------- -- -- ----- - ----- -------- -- ------------ ------ -------- -- ------------- -- --
在这个例子中:
Query.user
解析器负责根据传入的id
参数查找用户。User.name
和User.email
解析器负责从父对象(即user
解析器返回的结果)中提取name
和email
字段的值。
解析器的参数
- parent:父字段的解析结果。对于根查询字段(如
Query.user
),parent
通常是null
。对于嵌套字段(如User.name
),parent
是父字段的解析结果。 - args:客户端传递的参数。例如,在
Query.user(id: ID!)
中,args
包含id
参数。 - context:上下文对象,通常用于传递请求相关的信息(如用户身份、数据库连接等)。上下文对象在解析器之间共享。
- info:包含查询的抽象语法树(AST)和其他元数据。通常用于高级场景,如自定义查询优化。
解析器的返回值
解析器可以返回以下类型的值:
- 同步值:直接返回数据。
- Promise:返回一个 Promise,GraphQL 会等待 Promise 解析后再继续执行。
- async/await:使用
async
函数和await
关键字处理异步操作。
例如,以下解析器使用 async/await
从数据库中获取用户数据:
const resolvers = { Query: { user: async (parent, args, context, info) => { const user = await context.db.findUserById(args.id); return user; }, }, };
通过这种方式,解析器能够灵活地处理各种数据源和异步操作,从而满足复杂的业务需求。