GraphQL请求字段不存在且没有错误

时间:2019-11-14 14:30:27

标签: graphql

我正在尝试与GraphQL API向后兼容。

我们拥有本地服务器,这些服务器会根据它们何时连接到互联网进行定期更新。我们有一个移动应用程序可与本地服务器通信。

问题

我们遇到了一个问题,即移动应用程序是最新的而本地服务器不是最新的。发生架构更改时,会引起问题。

示例

产品版本1

type Product {
 name: String
}

产品版本2

type Product {
 name: String
 account: String
}

新版本的移动应用要求:

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

由于account在版本1中无效,因此出现错误:

  

“无法查询类型为“产品”的字段“帐户”。

有人知道我如何避免这个问题,所以我没有收到这个特殊的错误。我对accountNull或其他一些用于更新Schema的攻击计划完全满意。但是完全炸毁而没有任何响应是不好的

1 个答案:

答案 0 :(得分:0)

您的问题未指定您在后端实际使用的内容。但是应该有可能基于JavaScript参考实现自定义GraphQL服务在任何实现中使用的验证规则。在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部署到服务器之前,不应推送依赖于该服务器API的较新版本的客户端的新版本。期。无论您是否使用GraphQL,REST,SOAP等,这都是正确的。