建立GraphQL API
建立GraphQL API
- 語言、環境、工具包 GraphQL.js + express-graphql + ApolloServer
GraphQL規範釋出的時候,它就致力於對查詢語言和型別系統的提供解釋。同時有意識地模糊了伺服器實現方面的細節,從而讓各種語言的開發者都能將其應用到他們的專案中。 不過我們還是使用最常用的JavaScript Facebook團隊開發了一個JavaScript庫,名為GraphQL.js。與此同時,他們還發布了express-graphql,可以幫助你使用Express簡單地建立GraphQL伺服器,這是第一個幫助開發人員實現這種服務的庫
選擇使用ApolloServer
Apollo Server的設定相當簡單,而且提供了一系列可用於生產的功能,包括訂閱、檔案上傳、用於快速連線現有服務的資料來源API,以及開箱即用的Apollo Engine。當然,它也包括了GraphQL Playground,方便開發者在瀏覽器內直接編寫查詢欄位。
專案設定
-
新建專案資料夾
-
生成新的專案,通過終端或cmd開啟該資料夾,然後輸入npm init-y命令來生成一個新的npm專案
-
安裝專案依賴:apollo-server和graphql及nodemon
nodemon將觀察檔案的更改,並在我們做出更改時重啟伺服器。讓我們將nodemon的命令新增到package.json中。
每次執行npm start時,index.js檔案都將執行,nodemon將觀察所有帶有.js、.json或.graphql副檔名檔案的更改。當然,我們還要在根目錄下建立一個index.js檔案。確保package.json中的主檔案指向index.js。
解析器
schema描述的是資料需求,它並不做獲取資料的工作。 解析器是一個函式,它依照特定欄位返回資料。解析器函式返回schema指定的型別和格式的資料。解析器可以是非同步的,它可以從REST API、資料庫或其他任何服務獲取或更新資料。
typeDefs變數是我們定義schema的地方。它僅僅是個字串。每當我們建立像totalPhotos這樣的查詢時,它應該由同名的解析器函式提供支援。型別定義描述了欄位應該返回的型別 值得注意的是,解析器必須和schema中的物件具有相同的typename(類名)。totalPhotos欄位是查詢物件的一部分。該欄位的解析器也必須是Query(查詢)物件的一部分 我們已經為根查詢建立了初始型別定義。同時我們還建立了第一個支援totalPhotos查詢欄位的解析器。要建立schema並對schema進行查詢,我們將使用Apollo伺服器:
解析器是GraphQL實現的關鍵。每個欄位必須有一個相應的解析器函式。解析器必須遵循schema的規則。它必須與schema中定義的欄位具有相同的名稱,並且必須返回schema定義的資料型別。以上這些都是必須遵守的規則。
- 根解析器
GraphQL API在Query(查詢)、Mutation(變更)和Subscription(訂閱)上都有其根型別。這些型別位於最頂層,代表了API所有可能的入口點
讓我們為Mutation建立根型別。Mutation欄位為postPhoto,它將name和description作為String型別的引數。傳送變更項時,它必須返回一個布林值:
建立postPhoto變更項後,我們需要在resolvers物件中新增相應的解析器:
- 型別解析器 當執行GraphQL的查詢、變更或訂閱時,它將返回和查詢相同格式的結果,前面我們已經看到了解析器如何返回標量型別值,比如整數、字串和布林值,其實解析器也可以返回物件。
傳送給解析器的第一個引數總是parent物件