我們正在研究使用GraphQL來開發我們正在開發的無頭CMS版本2。如何使用GraphQL模式進行JSON模式數據驗證?
在此CMS的第1版中,我們使用JSON模式在保存到數據庫中之前根據模式驗證每個文檔 - 例如,如果它是博客文章,它將根據Article
模式進行驗證,並且如果這是一個綜合報告(「最佳」列表),它將根據Roundup
模式進行驗證。
對於版本2,我們正在考慮在API中使用GraphQL。然後,我們發現GraphQL模式基本上與JSON模式平行 - 它描述了文檔結構,字段類型等。
所以我們可以簡單地擁有「模式真相的一個來源」,即GraphQL模式,並將其用於查詢文檔並在保存新修訂版時驗證新文檔。 (請注意,我正在討論如何根據GraphQL模式驗證JSON數據,而不是驗證針對模式的GraphQL查詢。)
我認爲數據將根據模式中的所有字段進行驗證,因爲已棄用的字段除外你只想驗證字段的「最新版本」。
我們可以做的三兩件事之一:
- 使用GraphQL AST直接驗證文檔,即寫數據驗證自己。
- 使用GraphQL AST生成JSON模式,並使用標準的JSON模式驗證器實際驗證它。
- 只要接受GraphQL不太適合驗證,並定義模式兩次 - 一次在GraphQL中進行查詢,並再次在JSON模式中進行驗證(煩人和容易出錯以保持同步)。
問題:是#1和#2愚蠢的想法?是否有任何GraphQL工具可以進行這種數據驗證?有沒有其他方法可以在不定義模式兩次的情況下實現這一點?
作爲參考,我們的後端將用Python編寫,但管理用戶界面將是客戶端React和JavaScript。這是一個簡化版本,我們正在談論的那種GraphQL架構的(支持「條」和「農達」文檔類型):
schema {
query: Query
}
type Query {
documents: [Document!]!
document(id: Int): Document!
}
interface Document {
id: Int!
title: String!
}
type Article implements Document {
id: Int!
title: String!
featured: Boolean!
sections: [ArticleSection!]!
}
union ArticleSection = TextSection | PhotoSection | VideoSection
type TextSection {
content: String!
heading: String
}
type PhotoSection {
sourceUrl: String!
linkUrl: String
caption: String
content: String
}
type VideoSection {
url: String!
}
type Roundup implements Document {
id: Int!
title: String!
isAward: Boolean!
intro: String
hotels: [RoundupHotel!]!
}
type RoundupHotel {
url: String!
photoUrl: String @deprecated(reason: "photoUrl is deprecated; use photos")
photos: [RoundupPhoto!]!
blurb: String!
title: String
}
type RoundupPhoto {
url: String!
caption: String
}
你知道https://github.com/jakubfiala/graphql-json-schema嗎?我試用了你的graphql模式,基礎對我來說很好。 https://runkit.com/fdlk/59baf17d01ac700012e110b4魔鬼可能在細節中。 – flup
是否有你想使用GraphQL的原因?看起來你將會失去很多,因爲你有實際的模式驗證。 –