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

时间:2019-08-28 17:47:00

标签: graphql

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

std::regex r(R"(\s*[0-9A-Za-z_.]+\s*=\s*[a-zA-Z0-9._()\s\-,/*+!~"'?<>\[\]{}|^%$#@]+)");

由于某些旧数据限制,我可能有名字或型号。我宁愿在GraphQL验证层而不是代码中强制执行此操作。

编辑: 关于将验证添加到graphQL规范,有一些很好的讨论,您可以在这里阅读:https://github.com/graphql/graphql-js/issues/361

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

https://github.com/xpepermint/graphql-type-factory

https://github.com/stephenhandley/graphql-validated-types

我将坚持验证代码中的类型,至少直到它们添加更好的支持为止。

2 个答案:

答案 0 :(得分:2)

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

明智的模式如下:

type Name {
  value : String!
}

type Model {
  value : String!
}

union NameOrModel = Name | Model

type Starship {
  id: ID!
  nameOrModel : NameOrModel!
  length(unit: LengthUnit = METER): Float
}

这是非常丑陋的IMO,因为它给架构带来了许多不必要的噪音和复杂性。因此,我宁愿坚持使用原始架构,并在后端手动进行检查。

答案 1 :(得分:1)

来自the spec

  

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

单个字段可以为可为空或不可为空。非空验证发生在字段级别,独立于其他字段。因此,没有任何机制可以验证字段的某些组合是否为空。