
- GraphQL 教程
- GraphQL - 首頁
- GraphQL - 簡介
- GraphQL - 環境搭建
- GraphQL - 架構
- GraphQL - 應用元件
- GraphQL - 例子
- GraphQL - 型別系統
- GraphQL - 模式
- GraphQL - 解析器
- GraphQL - 查詢
- GraphQL - 變異
- GraphQL - 驗證
- GraphQL - JQuery 整合
- GraphQL - React 整合
- GraphQL - Apollo Client
- GraphQL - 客戶端認證
- GraphQL - 快取
- GraphQL 有用資源
- GraphQL - 快速指南
- GraphQL - 有用資源
- GraphQL - 討論
GraphQL - 模式
GraphQL 模式是任何 GraphQL 伺服器實現的核心。它描述了連線到它的客戶端應用程式可用的功能。我們可以使用任何程式語言來建立 GraphQL 模式並在其周圍構建介面。
GraphQL 執行時定義了一個通用的基於圖的模式來發布它所代表的資料服務的 capabilities。客戶端應用程式可以在其 capabilities 內查詢模式。這種方法解耦了客戶端和伺服器,並允許兩者獨立地演進和擴充套件。
在本章中,我們使用 Apollo 伺服器執行 GraphQL 查詢。graphql-tools 中的 makeExecutableSchema 函式可以幫助你繫結模式和解析器。
makeExecutableSchema 函式語法
makeExecutableSchema 函式接受一個 Object 型別的單個引數 {}。使用此函式的語法如下:
import { makeExecutableSchema } from 'graphql-tools'; const jsSchema = makeExecutableSchema({ typeDefs, resolvers, // optional logger, // optional allowUndefinedInResolve = false, // optional resolverValidationOptions = {}, // optional directiveResolvers = null, // optional schemaDirectives = null, // optional parseOptions = {}, // optional inheritResolversFromInterfaces = false // optional });
序號 | 引數及描述 |
---|---|
1 | typeDefs 這是必需引數。它表示作為 UTF-8 字串的 GraphQL 查詢。 |
2 | Resolvers 這是一個可選引數(預設為空物件)。它包含處理查詢的函式。 |
3 | logger 這是一個可選引數,可用於將錯誤列印到伺服器控制檯。 |
4 | parseOptions 這是一個可選引數,允許在將 typeDefs 指定為字串時自定義解析。 |
5 | allowUndefinedInResolve 預設為 true。設定為 false 時,如果你的解析函式返回 undefined,則會導致它們丟擲錯誤。 |
6 | resolverValidationOptions 這是一個可選引數,並接受一個包含布林屬性的物件。 |
7 | inheritResolversFromInterfaces 這是一個可選引數,並接受一個布林引數來檢查解析器物件的繼承。 |
示例
讓我們建立一個簡單的應用程式來理解這個模式。這將建立一個從伺服器查詢學生列表的模式。學生資料將儲存在平面檔案中,我們將使用名為 notarealdb 的 node 模組來模擬資料庫並從平面檔案中讀取。
步驟 1 - 下載並安裝專案所需的依賴項
建立一個名為 schema-app 的資料夾。從終端將你的目錄更改為 schema-app。然後,按照環境搭建章節中解釋的步驟 3 到 5 完成下載和安裝過程。
步驟 2 - 建立模式
在專案資料夾 schema-app 中新增 schema.graphql 檔案,並新增以下程式碼:
type Query { greeting:String students:[Student] } type Student { id:ID! firstName:String lastName:String password:String collegeId:String }
模式的根將是 Query 型別。查詢有兩個欄位 - greeting 和 Students,它們分別返回 String 和學生列表。Student 被宣告為 Object 型別,因為它包含多個欄位。ID 欄位被宣告為非空。
步驟 3 - 建立解析器
在專案資料夾中建立一個名為 resolvers.js 的檔案,並新增以下程式碼:
const db = require('./db') const Query = { greeting:() => { return "hello from TutorialsPoint !!!" }, students:() => db.students.list() } module.exports = {Query}
這裡 greeting 和 students 是處理查詢的解析器。students 解析器函式從資料訪問層返回學生列表。要訪問模組外部的解析器函式,必須使用 module.exports 匯出 Query 物件。
步驟 4 - 執行應用程式
建立一個 server.js 檔案,並參考環境搭建章節中的步驟 8。下一步是在終端中執行命令 npm start。伺服器將在 9000 埠啟動並執行。在這裡,我們使用 GraphiQL 作為客戶端來測試應用程式。開啟瀏覽器並輸入 URL:https://:9000/graphiql。
在編輯器中輸入以下查詢:
{ greeting students { id firstName lastName } }
查詢將顯示如下輸出:

注意 - 我們可以用 RESTful API 呼叫來替換 students.json 以檢索學生資料,甚至可以使用像 MySQL 或 MongoDB 這樣的真實資料庫。GraphQL 成為你原始應用程式層周圍的一個薄包裝器以提高效能。