我们正在研究使用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的原因?看起来你将会失去很多,因为你有实际的模式验证。 –