【问题标题】:GraphQL requesting fields that don't exist without errorGraphQL 请求不存在且没有错误的字段
【发布时间】:2020-03-10 13:14:12
【问题描述】:

我正在尝试处理与我的 GraphQL API 的向后兼容性。

我们有本地服务器,这些服务器会根据它们连接到互联网的时间定期更新。我们有一个与本地服务器对话的移动应用程序。

问题

我们遇到了一个问题,即移动应用程序是最新的,而本地服务器不是。当 Schema 发生变化时,它会导致问题。

示例

产品版本 1

type Product {
 name: String
}

产品版本 2

type Product {
 name: String
 account: String
}

新版移动应用要求:

product(id: "12345") {
  name
  account
}

因为account 在版本 1 中无效,我收到错误:

“无法查询类型 \"Product\" 上的字段 \"account\"。”

有谁知道我可以如何避免这个问题,所以我不会收到这个特定的错误。我完全同意account 带着Null 回来,或者只是其他一些更新Schema 的攻击计划。但是完全炸毁没有反应是不好的

【问题讨论】:

    标签: graphql


    【解决方案1】:

    您的问题未指定您在后端实际使用的内容。但是应该可以自定义 GraphQL 服务在基于 JavaScript 参考实现的任何实现中使用的验证规则。以下是您在 GraphQL.js 中的操作方式:

    const { execute, parse, specifiedRules, validate } = require('graphql')
    
    const validationRules = specifiedRules.filter(rule => rule.name !== 'FieldsOnCorrectType')
    const document = parse(someQuery)
    const errors = validate(schema, document, validationRules)
    const data = await execute({ schema, document })
    

    通过省略FieldsOnCorrectType 规则,您不会收到任何错误,并且无法识别的字段将被简单地排除在响应之外。

    但你真的不应该那样做。

    修改验证规则将导致对您的服务器进行破坏规范的更改,这可能会导致客户端库和您使用的其他工具出现问题。

    这个问题实际上归结为您的部署过程。在将该版本部署到服务器之前,您不应推送依赖于较新版本的服务器 API 的客户端的新版本。时期。无论您使用的是 GraphQL、REST、SOAP 等,这都是正确的。

    【讨论】:

      猜你喜欢
      • 2018-01-28
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 2019-05-08
      • 2023-01-19
      • 2015-01-05
      相关资源
      最近更新 更多