我们正在研究在我们正在开发的无头CMS的第二版中使用GraphQL。在此CMS的第一版中,我们使用JSON Schema对每个文档进行验证,以针对架构在保存到数据库之前进行验证--例如,如果是博客文章,它将根据“Article”模式进行验证,而如果是综述(“最佳”列表),则将根据“Roundup”模式进行验证。
对于第二版,我们正考虑使用GraphQL进行API。然后我们想到,GraphQL模式基本上与JSON模式并行--它描述了文档结构,字段类型等。
因此,我们可以仅拥有“一个模式真相来源”,即GraphQL模式,并在查询文档和保存新版本时同时用于验证新文档。(请注意,我谈论的是将JSON数据针对GraphQL模式进行验证,而不是针对模式验证GraphQL查询。)
我认为数据将根据模式中的所有字段进行验证,除了弃用的字段,因为您只想针对字段的“最新版本”进行验证。
我们可以采取以下三种方法之一:
1.直接使用GraphQL AST验证文档,即编写自己的数据验证器。
2.使用GraphQL AST生成JSON模式,并使用标准的JSON模式验证器实际验证它。
3.只需接受GraphQL不太适合验证,并分别定义模式-一次在GraphQL中进行查询,一次在JSON模式中进行验证(保持同步很麻烦且容易出错)。
问题:1和2是否是愚蠢的想法?是否存在执行此类数据验证的GraphQL工具?是否有其他方法可以在不定义两次架构的情况下实现这一点?
我们的后端将使用Python编写,但管理UI将是客户端React和JavaScript。这是我们正在谈论的GraphQL模式的缩减版本,支持“Article”和“Roundup”文档类型:
对于第二版,我们正考虑使用GraphQL进行API。然后我们想到,GraphQL模式基本上与JSON模式并行--它描述了文档结构,字段类型等。
因此,我们可以仅拥有“一个模式真相来源”,即GraphQL模式,并在查询文档和保存新版本时同时用于验证新文档。(请注意,我谈论的是将JSON数据针对GraphQL模式进行验证,而不是针对模式验证GraphQL查询。)
我认为数据将根据模式中的所有字段进行验证,除了弃用的字段,因为您只想针对字段的“最新版本”进行验证。
我们可以采取以下三种方法之一:
1.直接使用GraphQL AST验证文档,即编写自己的数据验证器。
2.使用GraphQL AST生成JSON模式,并使用标准的JSON模式验证器实际验证它。
3.只需接受GraphQL不太适合验证,并分别定义模式-一次在GraphQL中进行查询,一次在JSON模式中进行验证(保持同步很麻烦且容易出错)。
问题:1和2是否是愚蠢的想法?是否存在执行此类数据验证的GraphQL工具?是否有其他方法可以在不定义两次架构的情况下实现这一点?
我们的后端将使用Python编写,但管理UI将是客户端React和JavaScript。这是我们正在谈论的GraphQL模式的缩减版本,支持“Article”和“Roundup”文档类型:
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
}