2017-02-23 99 views
-1

好日子IM新手在这里和IM解决graphql和突变有一些问题IM有人可以解释这个代码块,我感谢你可以有人解释这段代码给我

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

当然,这是一个GraphQL服务器中两个突变的例子。我们可以分解它来理解正在发生的事情。

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

通过它要实现用一个看起来像这样的根突变型架构的长相:

type Mutation { 
    createAuthor: Author 
    createPost: Post 
} 

在GraphQL A型是由一组字段的每一个都可以有一个相关的解析器。 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

export type GraphQLFieldResolver<TSource, TContext> = (
    source: TSource, 
    args: { [argName: string]: any }, 
    context: TContext, 
    info: GraphQLResolveInfo 
) => mixed; 

GraphQLFieldResovler类型定义正如你可以看到GraphQLFieldResolver是一个函数,有4个参数。

  1. 来源:来源是当前字段的父对象。例如,如果您要为User类型的字段fullName定义解析器,则源将是完整的用户对象。
  2. args:该参数是该解析器的任何输入参数。在我上面的查询中,它将包含$post变量的值。
  3. 上下文:上下文是GraphQL执行的全局上下文。这对于传递解析器可能需要的信息很有用。例如,您包含一个数据库连接,您可以在解析器中使用该连接,而无需将其导入每个文件中。
  4. info:info对象包含有关您的GraphQL模式,查询以及其他信息(如正在执行的当前解析器的路径)的信息。这在很多方面都很有用。这是一个后谈论你如何使用它来预先计算查询:(https://scaphold.io/community/blog/querying-relational-data-with-graphql/

其类型和字段解析器的这种想法是什么使GraphQL如此强大的一部分。一旦你定义了你的输入系统和他们的字段的解析器,你可以根据你的需要来构建你的模式,无论查询可能有多深嵌套,GraphQL都会确保调用正确的解析器。

我希望这有助于:)

+0

感谢您对本甚至IM仍然混淆帮我:d –

+0

@mparis很好的解释,但你什么时候给我解释一下,并回答有关提问雷 –

相关问题