2017-02-23 52 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很好的解釋,但你什麼時候給我解釋一下,並回答有關提問雷 –

相關問題