如何在GraphQL模式中要求propertyA或propertyB

如何在GraphQL模式中要求propertyA或propertyB,graphql,Graphql,在下面的类型定义中,是否有方法要求名称或模型,而不是名称和模型 type Starship { id: ID! name: String! model: String! length(unit: LengthUnit = METER): Float } 由于一些遗留数据限制,我可能有名称或型号。我宁愿在GraphQL验证层而不是在代码中强制执行这一点 编辑: 关于向graphQL规范中添加验证,有一些很好的讨论,您可以在这里阅读: 还有几个库可以扩展验证: 我将坚持验证代码

在下面的类型定义中,是否有方法要求名称或模型,而不是名称和模型

type Starship {
  id: ID!
  name: String!
  model: String!
  length(unit: LengthUnit = METER): Float
}
由于一些遗留数据限制,我可能有名称或型号。我宁愿在GraphQL验证层而不是在代码中强制执行这一点

编辑: 关于向graphQL规范中添加验证,有一些很好的讨论,您可以在这里阅读:

还有几个库可以扩展验证:

我将坚持验证代码中的类型,至少在它们添加更好的支持之前。

来自:

默认情况下,GraphQL中的所有类型都可以为空;空值是上述所有类型的有效响应。要声明不允许null的类型,可以使用GraphQL非null类型。此类型包装基础类型,并且此类型的行为与包装类型相同,唯一的例外是null不是包装类型的有效响应。尾随感叹号用于表示使用非空类型的字段,如:
name:String


单个字段可以为空,也可以不为空。非空验证在字段级别进行,与其他字段无关。因此,没有验证某些字段组合是否为空的机制。

您可以尝试使用
union
来表示名称或模型概念。由于
union
现在仅适用于对象类型,这意味着您还需要首先将模型名称和模型作为对象类型

代码方面,架构如下所示:

类型名称{
值:字符串!
}
类型模型{
值:字符串!
}
联合名称或模型=名称|模型
型星际飞船{
id:id!
nameOrModel:nameOrModel!
长度(单位:LengthUnit=米):浮动
}

在我看来,这是非常丑陋的,因为它给模式带来了许多不必要的干扰和复杂性。所以我更愿意坚持您的原始模式,并在后端手动进行检查

是的,开箱即用似乎是不可能的。关于在graphql规范中添加验证,有一些很好的讨论。我原以为一个联合会可以工作,但太难闻了。我想我会问一下,看看是否有人有一个我不知道的简单解决方案。不幸的是,这个解决方案也不适用于输入对象,尽管@Kevin的问题专门涉及验证响应。作为一种解决方法,您还可以使用自定义标量来表示所有类型的自定义验证行为,但是通过内省,验证逻辑将不可见。是的。这是可悲的。希望GraphQL允许InputObject与union:D一起使用