当然,这是一个GraphQL服务器中两个突变的例子。我们可以分解它来理解正在发生的事情。
首先让我们看看类型系统。 GraphQL模式通常有两个根字段query
和mutation
(有时为subscription
)。这些根字段是数据层次结构的根,并公开您有权访问的查询(GET请求)和突变(POST,PUT,DELETE等请求)。
通过它要实现用一个看起来像这样的根突变型架构的长相:
type Mutation {
createAuthor: Author
createPost: Post
}
在GraphQL A型是由一组字段的每一个都可以有一个相关的解析器。 GraphQL中的解析器就像您将附加到REST中的端点的事件处理程序。
您已上面限定两个解析器将处理与createAuthor
和createPost
突变相关联的逻辑的代码。 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
export type GraphQLFieldResolver<TSource, TContext> = (
source: TSource,
args: { [argName: string]: any },
context: TContext,
info: GraphQLResolveInfo
) => mixed;
GraphQLFieldResovler类型定义正如你可以看到GraphQLFieldResolver是一个函数,有4个参数。
- 来源:来源是当前字段的父对象。例如,如果您要为
User
类型的字段fullName
定义解析器,则源将是完整的用户对象。
- args:该参数是该解析器的任何输入参数。在我上面的查询中,它将包含
$post
变量的值。
- 上下文:上下文是GraphQL执行的全局上下文。这对于传递解析器可能需要的信息很有用。例如,您包含一个数据库连接,您可以在解析器中使用该连接,而无需将其导入每个文件中。
- info:info对象包含有关您的GraphQL模式,查询以及其他信息(如正在执行的当前解析器的路径)的信息。这在很多方面都很有用。这是一个后谈论你如何使用它来预先计算查询:(https://scaphold.io/community/blog/querying-relational-data-with-graphql/)
其类型和字段解析器的这种想法是什么使GraphQL如此强大的一部分。一旦你定义了你的输入系统和他们的字段的解析器,你可以根据你的需要来构建你的模式,无论查询可能有多深嵌套,GraphQL都会确保调用正确的解析器。
我希望这有助于:)
感谢您对本甚至IM仍然混淆帮我:d –
@mparis很好的解释,但你什么时候给我解释一下,并回答有关提问雷 –