有人可以向我解释这段代码

时间:2017-02-23 05:19:56

标签: graphql

美好的一天,我新手在这里,我正在处理graphql和我有一些突变的问题,有人可以解释这段代码谢谢你

 RootMutation: {
createAuthor: (root, args) => { return Author.create(args); },
createPost: (root, { authorId, tags, title, text }) => {
  return Author.findOne({ where: { id: authorId } }).then( (author) => {
    console.log('found', author);
    return author.createPost( { tags: tags.join(','), title, text });
  });
},
},

1 个答案:

答案 0 :(得分:1)

当然,这是GraphQL服务器中两个突变的示例。我们可以将其分解以了解正在发生的事情。

首先让我们看一下类型系统。 GraphQL架构通常有两个根域querymutation(有时候subscription)。这些根字段是数据层次结构的根,并公开您有权访问的查询(GET请求)和突变(POST,PUT,DELETE等请求)​​。

从外观上看,您正在实现一个具有如下所示的根突变类型的模式:

type Mutation {
  createAuthor: Author
  createPost: Post
}

GraphQL中的一个类型由一组字段组成,每个字段都可以有一个关联的解析器。 GraphQL中的解析器就像您将附加到REST中的端点的事件处理程序。

上面的代码定义了两个解析器,它们将处理与createAuthorcreatePost突变相关的逻辑。 I.E. createPost解析器中的代码是我发出如下查询时将运行的代码:

mutation CreatePost($post: CreatePostInput!) {
  createPost(input: $post) {
    id
    title
    tags
    text
  }
}

GraphQL运行时解析查询并根据查询内容将操作路由到正确的解析程序。在这个例子中,它会看到我调用createPost突变并确保调用createPost解析器,在你的情况下看起来像这样:

createPost: (root, { authorId, tags, title, text }) => {
  return Author.findOne({ where: { id: authorId } }).then( (author) => {
    console.log('found', author);
    return author.createPost( { tags: tags.join(','), title, text });
  });
},

要了解解析器的工作原理,让我们从 graphql-js

中查看 GraphQLFieldResovler 类型定义
export type GraphQLFieldResolver<TSource, TContext> = (
  source: TSource,
  args: { [argName: string]: any },
  context: TContext,
  info: GraphQLResolveInfo
) => mixed;

正如您所看到的,GraphQLFieldResolver是一个带有4个参数的函数。

  1. 来源:来源是当前字段的父对象。例如,如果您为fullName类型的字段User定义解析程序,则源将是完整的用户对象。
  2. args :args是该解析器的任何输入参数。在我上面的查询中,它将包含$post变量的值。
  3. context :Context是GraphQL执行的全局上下文。这对于传递解析器可能需要的信息非常有用。例如,您包含一个数据库连接,您可以从解析器中使用该连接,而无需在每个文件中导入它。
  4. info :info对象包含有关GraphQL架构,查询和其他信息的信息,例如当前正在执行的解析程序的路径。这在很多方面都很有用。这是一篇关于如何使用它来预先计算查询的帖子:(https://scaphold.io/community/blog/querying-relational-data-with-graphql/
  5. 这种拥有类型和字段解析器的想法是使GraphQL如此强大的一部分。一旦你定义了你的字段的类型系统和解析器,你可以根据需要构建你的架构,无论查询嵌套的程度如何,GraphQL总是会确保调用正确的解析器。

    我希望这会有所帮助:)