我正在尝试与GraphQL API向后兼容。
我们拥有本地服务器,这些服务器会根据它们何时连接到互联网进行定期更新。我们有一个移动应用程序可与本地服务器通信。
我们遇到了一个问题,即移动应用程序是最新的而本地服务器不是最新的。发生架构更改时,会引起问题。
产品版本1
type Product {
name: String
}
产品版本2
type Product {
name: String
account: String
}
新版本的移动应用要求:
product(id: "12345") {
name
account
}
由于account
在版本1中无效,因此出现错误:
“无法查询类型为“产品”的字段“帐户”。
有人知道我如何避免这个问题,所以我没有收到这个特殊的错误。我对account
和Null
或其他一些用于更新Schema的攻击计划完全满意。但是完全炸毁而没有任何响应是不好的
答案 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等,这都是正确的。