掘金 后端 ( ) • 2024-04-06 17:45

在GraphQL中,解析器函数(Resolver Function)通常有四个参数:parent, args, context, 和 info。这些参数为解析器提供了执行其逻辑所需的所有必要信息。我将对每个参数进行解释:

1. parent(有时被称为root或source)

  • 描述parent参数表示解析器链中上一个解析器的返回值。对于顶层查询(在Query类型中),parent通常是undefined,因为它们是解析器链的起点。
  • 使用场景:在解析嵌套对象时非常有用。例如,在解析User类型中的posts字段时,parent是该特定用户的数据。

很好判断:

date解析器函数参数job,直接向上找,第一个冒号之前的 type 类型就是job的类型;
换成数据,就是jobs中拿到的Job数组,然后继续解析。比如数组长度是5,那这5组数据继续依次解析,执行date解析器函数,每一组都作为date解析器函数的第一个参数。

当jobs中有多少组数据,那么就会执行date解析器函数多少次;

type Query {
  jobs: [Job!]
}
type Job {
  id: ID!
  date: String!
  title: String!
  description: String
}

export const resolvers = {
  Query: {
    jobs: async () => {
      return await getJobs();
    },
  },
  Job: {
    date: (job) => {
      return "2012-12-12";
    },
  },
};

2. args

  • 描述args包含了传递给查询或变更的参数。这些参数是在GraphQL查询或变更中明确定义的。
  • 使用场景:用于处理客户端传递给查询或变更的参数,例如,获取特定ID的用户或添加新用户时的用户数据。

3. context

  • 描述context是一个在所有解析器中共享的对象,通常用于存放跨解析器需要访问的数据,如用户认证信息、数据库连接等。
  • 使用场景:适合放置需要在多个解析器之间共享的数据,如当前用户、数据库连接、自定义服务等。

4. info

  • 描述info包含了关于当前操作的字段特定信息,包括字段名、路径到字段的路径、请求的根查询等。这是一个高级参数,包含了AST(抽象语法树)和其他技术细节。
  • 使用场景:主要用于高级用例,如性能优化、日志记录或执行复杂的查询操作。

示例

以下是一个带有这些参数的解析器函数的示例:

const resolvers = {
  Query: {
    user: (parent, args, context, info) => {
      // 使用args中的id来获取用户信息
      return context.db.getUserById(args.id);
    }
  }
};

在这个例子中,user解析器接收了一个args对象,该对象包含了客户端查询时提供的参数,然后它使用context中的数据库连接来获取用户信息。

总结

这四个参数为解析器提供了执行其逻辑所需的上下文和数据。parent提供了上一个解析器的输出,args提供了客户端提供的参数,context提供了跨解析器共享的数据,而info则提供了关于查询本身的详细信息。理解这些参数对于编写有效的GraphQL解析器至关重要。