首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用GraphQL模式进行类似于JSON schema的数据验证?

如何使用GraphQL模式进行类似于JSON schema的数据验证?
EN

Stack Overflow用户
提问于 2017-08-30 23:18:46
回答 1查看 2.8K关注 0票数 22

我们正在研究在我们正在开发的无头CMS的版本2中使用GraphQL。

在CMS的第1版中,在将文档保存到数据库之前,我们使用JSON schema根据模式验证每个文档--例如,如果是博客文章,则根据Article模式进行验证;如果是舍入(“最佳”列表),则根据Roundup模式进行验证。

对于版本2,我们正在考虑为应用程序接口使用GraphQL。然后,我们发现GraphQL模式基本上与JSON模式是平行的--它描述了文档结构、字段类型等。

因此,我们可以简单地使用“一个模式真值来源”,即GraphQL模式,并将其用于查询文档和在保存新修订时验证新文档。(请注意,我说的是针对GraphQL模式验证JSON数据,而不是针对模式验证GraphQL查询。)

我认为数据将针对模式中的所有字段进行验证,但不推荐使用的字段除外,因为您只想针对字段的“最新版本”进行验证。

我们可以做以下三件事之一:

  1. 直接使用GraphQL AST来验证文档,即自己编写一个数据验证器。
  2. 使用JSON AST生成JSON Schema,并使用标准的GraphQL Schema验证器对其进行实际验证。
  3. 只是接受GraphQL不太适合验证这一事实,并定义了两次模式--一次在GraphQL中进行查询,另一次在JSON schema中进行验证(这很烦人,而且容易出错,以保持它们的同步)。

问题:是#1和#2愚蠢的想法吗?有没有可以做这种数据验证的GraphQL工具?有没有其他方法可以在不两次定义模式的情况下实现这一点?

作为参考,我们的后端将使用Python语言编写,但管理UI将是客户端React和JavaScript。这是我们正在讨论的那种GraphQL模式的简化版本(支持“文章”和"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
}
EN

回答 1

Stack Overflow用户

发布于 2017-09-19 01:00:14

在不断变化的情况下的确定性水平

GraphQL仍然是一种发展中的技术(as it says right at the top of the spec document),因此可以肯定地说,对于这个问题没有真正的“正确”答案。

概论

InputObject类型(接口定义语言术语中的“输入”)、列表(IDL术语中的“[]”)以及各种标量似乎完全涵盖了您在JSON中可以做的事情。

如果GraphQL的Python实现符合规范,那么以GraphQL文字或(更好的)“变量”形式提供数据应该可以提供定制验证所能提供的一切: GraphQL验证将做正确的事情。

针对您的情况的建议

基于我到目前为止在GraphQL上的工作,我的建议是“顺其自然”。如果您的GraphQL模式符合数据架构的要求,那么只需使用普通的GraphQL验证即可。如果您确实进行了自己的验证,那么应该在GraphQL完成其正常的数据形状检查之后进行验证。

总结以上几点,并用一个问题来回答您的问题:让GraphQL在其正常功能中执行验证重担有什么错?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45964170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档