我们正在研究将GraphQL用于我们正在开发的无头CMS的第2版 .
在此CMS的版本1中,我们使用JSON Schema在保存到数据库之前根据模式验证每个文档 - 例如,如果's a blog article it'd针对 Article
模式进行验证,并且's a roundup ( 119404 list) it'd针对 Roundup
进行验证架构 .
对于版本2,我们正在考虑将GraphQL用于API . 然后我们发现GraphQL模式基本上与JSON模式并行 - 它描述了文档结构,字段类型等 .
因此,我们可以简单地使用“一个模式真实来源”,即GraphQL模式,并在保存新版本时使用它来查询文档和验证新文档 . (请注意,我正在讨论针对GraphQL架构验证JSON数据,而不是针对架构验证GraphQL查询 . )
我认为数据将针对架构中的所有字段进行验证,但已弃用的字段除外,因为您只想验证字段的“最新版本” .
我们可以做以下三件事之一:
-
直接使用GraphQL AST来验证文档,即自己编写数据验证器 .
-
使用GraphQL AST生成JSON模式,并使用标准JSON模式验证程序实际验证它 .
-
只是接受GraphQL不适合验证,并定义架构两次 - 一次在GraphQL中进行查询,再在JSON Schema中进行验证(烦人且容易出错以保持同步) .
Questions: #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
}
1 回答
在不断变化的情况下的确定性水平
GraphQL仍然是一种不断发展的技术(as it says right at the top of the spec document),因此可以肯定地说,没有真正的"correct"答案 .
一般性
InputObject类型(接口定义语言术语中的“输入”)与列表(IDL术语中的“[]”)以及各种标量似乎完全涵盖了您可以在JSON中执行的操作 .
如果GraphQL的Python实现符合规范,那么将数据作为GraphQL文字或(更好)作为“变量”提供应该提供自定义验证所能提供的一切:GraphQL验证将做正确的事情 .
针对您的情况的建议
根据我迄今为止使用GraphQL的工作,我的建议是"go with the grain" . 如果您的GraphQL架构符合您的数据架构所需,只需使用普通的GraphQL验证 . 如果您确实进行了自己的验证,那么应该在GraphQL完成正常的数据形状检查之后进行验证 .
总结以上几点,并用一个问题回答你的问题:让GraphQL正常运行有什么问题呢?