標量(scalartypedefinition)是 graphql 中不可分割的原子資料型別,在服務中充當葉子節點。對於客戶端而言,合法的查詢集(select set)必須到達葉子節點,也就是到達標量型別節點。
graphql 規範提供了五種標量:
int: 32 位有符號整型,超出精度範圍後,引擎會丟擲異常
float: 有符號雙精度浮點數,超出精度範圍後,引擎會丟擲異常
string: 字串,用於表示utf-8
字串行
boolean: bool 值
id: 資源唯一標誌符
上述五種型別與其他語言對應的型別定義相似,相信讀者老爺們都已經非常熟悉,無需贅述,唯一值得**的是id
型別。
表現上id
型別只是乙個字串格式的值,引擎支援字串解析值,也支援將int
解析值轉換為字串型別;
語義上"id
" 型別應該用於唯一標誌乙個資源物件,也就是說,使用相同 id 值,無論查詢多少次,結果都應該是同一物件,這一點有助於實現快取,是 graphql 推薦的快取方案;
引擎並不限制解析值的唯一性,查詢結果包含多個 id 值相同的節點是合法的。
我們來看一下例子加深印象:
[
// 字串型別
, // int 型別,引擎會將其轉換為字串
, // float 型別
// 非法值,引擎不支援float轉換
// 將丟擲 `typeerror` 錯誤
, // 與上面第一條重複
// 合法值,引擎並不強制 `id` 值的唯一性
]
除規範定義的標量外,還可以按需定義業務範疇內的標量。語法非常簡單:
scalar datetime
注意,這只是語義範疇定義,還需要定義序列化、反序列化函式:
new graphqlscalartype(,
// 解析函式
parsevalue(value)
throw new error("引數型別錯誤");
},// 解析函式
parseliteral(ast)
throw new error("引數型別錯誤");
}});
下面我們乙個乙個看這些配置:
name
: 欄位名,請保持與schema中定的標量型別名稱保持一致
description
: 型別描述,在一些診斷工具上還是很有用的
serialize
: 序列化函式,用於將結果轉換為適合 http 傳輸的數值型別
parsevalue
: 解析函式,用於將客戶端通過variables引數傳遞的數值為 date 型別
parseliteral
: 同樣是解析函式,將客戶端傳遞的字面量引數解析為 date 型別
配置中的parsevalue
、parseliteral
兩個函式功能上相似,都用於解析客戶端引數,分別處理兩種引數傳遞方式:
# variables 引數
# 引擎將呼叫 parsevalue 函式
query (before: datetime)
}variables
# 字面量引數
# 引擎將呼叫 parseliteral 函式
query
}
最後說一些注意的點:
如果型別確定不會作為inputtype
,可以省略parsevalue
、parseliteral
。
parsevalue
接收到的是variables
物件中對應的值;而parseliteral
接收的則是引擎從query
語句中解析出的 ast 節點。ast 節點內容形如:
}
標量型別也支援返回結構化的物件,只要能為引擎提供符合規則的serialize
函式,一切皆有可能。我們可以寫出這樣乙個標量:
// address 物件型別,不過這是乙個標量
new graphqlscalartype(
return value;
}});
但是要注意,標量型別是不可分割的,不能再傳入查詢子集:
# 合法請求
query
}
返回結果:
}]
}}
完整**在 此處。
能做是一回事,該不該這麼做,又是另一回事,返回物件的標量雖然合乎規則,但卻違反了按需載入這一重要原則,沒有實際意義也不值得推崇。
標量是 graphql 中的原子型別,一般充當查詢的葉子節點。
graphql 規範提供了五種標量型別,其中id
最為特殊,用於唯一標誌乙個資源例項。
在標準標量之外,也可以按需定義新的標量,規則如上。
標量型別與復合型別
1.記錄型別 定義語法 type type nameis record field declare field declare.identifiertype name 說明 type name 為我們定義的結構體變數型別,identifier 為需要使用的結構體變數。如 declare type e...
oracle PL SQL 標量資料型別
字元資料型別 型別名稱 描述char 定長的字串資料型別。必須使用整數定義其長度。long 他是乙個變長得字串,最大長度可達32k位元組 nvarchar2 儲存變長的字元資料 數值資料型別 binary double 雙精度浮點模型 binary float 單精度浮點模型 number 可以儲存...
GraphQL 引數型別與引數傳遞
2019graphql入門到精通 graphql基本引數型別 graphql基本引數傳遞 type query numdice不能為空,numsides可以為空,返回值為int型別陣列 graphql允許客戶自定義引數型別,通常用來描述想要獲取的資源的屬性。graphiql true 開啟除錯模式 ...