GraphQL请求不带';不存在没有错误

GraphQL请求不带';不存在没有错误,graphql,Graphql,我正在尝试处理与GraphQLAPI的向后兼容性 我们有内部部署的服务器,它们会根据连接到internet的时间定期更新。我们有一个移动应用程序,可以与本地服务器对话 问题 我们遇到了一个问题,移动应用程序是最新的,而本地服务器不是。当模式发生更改时,会导致问题 例子 产品版本1 type Product { name: String } 产品版本2 type Product { name: String account: String } 新版移动应用程序要求: product(id

我正在尝试处理与GraphQLAPI的向后兼容性

我们有内部部署的服务器,它们会根据连接到internet的时间定期更新。我们有一个移动应用程序,可以与本地服务器对话

问题 我们遇到了一个问题,移动应用程序是最新的,而本地服务器不是。当模式发生更改时,会导致问题

例子 产品版本1

type Product {
 name: String
}
产品版本2

type Product {
 name: String
 account: String
}
新版移动应用程序要求:

product(id: "12345") {
  name
  account
}
由于
account
在版本1中无效,我得到错误:

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


有人知道我如何避免这个问题,这样我就不会收到这个特别的错误。我完全同意
account
带着
Null
回来,或者只是为了更新模式而采取的一些其他攻击计划。但是让它完全爆炸而没有响应是不好的

你的问题没有说明你在后端实际使用了什么。但是,应该可以自定义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 })
通过省略
字段soncorrectType
规则,您将不会得到任何错误,并且响应中将不包含未识别的字段

但你真的不应该那样做。

修改验证规则将导致服务器发生违反规范的更改,这可能会导致您使用的客户端库和其他工具出现问题


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

您的问题没有指定您在后端实际使用的内容。但是,应该可以自定义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 })
通过省略
字段soncorrectType
规则,您将不会得到任何错误,并且响应中将不包含未识别的字段

但你真的不应该那样做。

修改验证规则将导致服务器发生违反规范的更改,这可能会导致您使用的客户端库和其他工具出现问题

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