在下面的类型定义中,有没有办法要求名称或模型,而不是名称和模型?
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
我将坚持验证代码中的类型,至少直到它们添加更好的支持为止。
答案 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!
。
单个字段可以为可为空或不可为空。非空验证发生在字段级别,独立于其他字段。因此,没有任何机制可以验证字段的某些组合是否为空。