當然,這是一個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很好的解釋,但你什麼時候給我解釋一下,並回答有關提問雷 –