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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (248)

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

在CMS的第1版中,我们使用JSON Schema在保存到数据库之前对照模式验证每个文档 - 例如,如果它是一篇博客文章,它将根据Article模式进行验证,并且它是一个综合报告(“最好的“列表),它将根据Roundup模式进行验证。

对于版本2,我们正在考虑使用GraphQL作为API。然后,我们发现GraphQL模式基本上与JSON模式并行 - 它描述了文档结构,字段类型等。

因此,我们可以简单地拥有“模式真相的一个来源”,即GraphQL模式,并在保存新修订版时使用它来查询文档和验证新文档。(请注意,我正在讨论如何根据GraphQL模式验证JSON数据,而不是验证针对模式的GraphQL查询。)

我认为数据将根据模式中的所有字段进行验证,除了已弃用的字段以外,因为您只需要针对字段的“最新版本”进行验证。

我们可以做三件事之一:

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

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

作为参考,我们的后端将用Python编写,但管理用户界面将是客户端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
}
提问于
用户回答回答于

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

GraphQL仍然是一个不断发展的技术(正如它在规范文档的顶部所说的那样),所以可以肯定地说没有真正的“正确”答案。

泛泛而谈

InputObject类型(接口定义语言术语中的“输入”)以及列表(IDL术语中的“[]”)与各种标量一起似乎完全涵盖了您可以在JSON中执行的操作。

如果GraphQL的Python实现符合规范,那么将数据作为GraphQL文本或(更好)作为“变量”提供应该提供自定义验证的所有内容:GraphQL验证将做正确的事情。

为情况推荐

根据我到目前为止使用GraphQL的工作,我的建议是“随谷物一起去”。如果您的GraphQL模式符合数据架构要求,只需使用普通的GraphQL验证。如果你确实做了自己的验证,它应该 GraphQL完成其正常的数据形状检查之后。

总结以上几点,并用一个问题来回答你的问题:让GraphQL在其正常运行中出现什么问题会导致验证繁重?

热门问答

怎么使用rsa?

Tina

腾讯云 · 产品经理 (已认证)

Go Serverless!
推荐
您好,可以在在本地安装rsa module后,将依赖一起打zip包上传SCF运行。https://pypi.org/project/rsa/ 在本地做SCF项目的编辑和部署,推荐您使用tcf cli,更加方便高效。 https://github.com/tencentyun/tc...... 展开详请

5.17 更新的备案材料下载是怎么回事?

为了减少下载错误的核验单模板,官网文档中《网站真实性核验单》下载入口已经下掉,可以按照如下方式操作: 1、在备案流程中——上传资料——核验单环节下载 2、在了解备案的省份、单位性质后,可在工单中提供对应省份的核验单模板给到你。 ... 展开详请

域名在腾讯备的案,解析的腾讯云,现在想把域名解析到别商家的服务器,腾讯云会把备案注销吗?

software微软、谷歌、腾讯、阿里、百度……
推荐

接入商都是有责任对备案进行定期核查的,核查中如果客户在腾讯云进行了备案未解析腾讯云服务器是需要重新解析腾讯云服务器的,否则会被取消接入,反之解析了服务器未进行备案各家接入商也是有相应的限制的,比如:腾讯云对未在腾讯云备案的域名会进行未备案阻断。

对象存储COS有没有日志功能?

Hyman Wang

腾讯云 · 高级产品经理 (已认证)

推荐已采纳

你的cos 是否开通了 CDN 加速,如果开通了CDN 加速,可以去 CDN 的控制台下: (统计分析 --- 监控 )页面下拉到底部,可以通过 URL 查看流量情况。

对象存储里的视频能在线播放么?

Jinqn

腾讯 · 高级工程师 (已认证)

腾讯云COS前端开发
推荐

购买的云数据库里面有什么类型的数据库?有SQLserver吗?可以自己安装SQLserver吗?

帅的惊动我国计算机大神
推荐已采纳
云关系型数据库让您在云中轻松部署、管理和扩展的关系型数据库,提供安全可靠、伸缩灵活的按需云数据库服务。腾讯云关系型数据库提供 MySQL、SQL Server、MariaDB、PostgreSQL 数据库引擎,并针对数据库引擎的性能进行了优化。云关系型数据库是一种高度可用的托管服...... 展开详请

所属标签

扫码关注云+社区