resolver 是为 schema 中单个字段产出值的函数。GraphQL 逐字段遍历查询,并为每个字段调用对应的 resolver——这个遍历过程就是 resolver 链(resolver chain)。
resolver 的四个参数
每个 resolver 都会收到 (parent, args, context, info):
user.posts 时就是那个 User 对象)。{ id: "1" })。const resolvers = {
Query: {
// 顶层:parent 为 undefined;读取 args,用 context 访问数据
user: (_parent, args, ctx) => ctx.db.users.findById(args.id),
},
User: {
// 对每个 user 都会运行;parent 是已解析的 user 对象
posts: (parent, _args, ctx) => ctx.db.posts.findByAuthor(parent.id),
// 'name' 不需要 resolver -> 默认 resolver 会读取 parent.name
},
};
如果某个字段没有显式的 resolver,GraphQL 会使用一个默认 resolver,它只是读取 parent[fieldName]。这就是为什么普通对象上的标量字段通常不需要写代码。
理解 resolver 逐字段、自上而下、沿着 parent 链运行 既解释了嵌套数据是如何被组装的,也解释了为什么朴素的嵌套 resolver 会导致 N+1 问题——这正是随之而来的经典追问。