__resolveType 返回空对象
__resolveType returning empty objects
我正在尝试使用 graphql 实现表单验证。出于某种原因,当我 运行 这个查询时:
mutation validateForm($input: ValidateFormInput!) {
test: validateForm(
input: $input
) {
id
fieldValidations {
... on FailedValidation {
id
}
}
}
}
并且有一个字段验证没有错误 ('SuccessfullValidation') 它 returns {id:'some-id',fieldValidations:[{}]} 当它应该返回 {id :'some-id',fieldValidations:[]}。这对我来说尤其没有任何意义,因为 ID 在两个字段中都被标记为不可空字段,但是我没有收到任何错误。
解析器
FieldValidation: {
__resolveType(obj: any) {
if (obj.error || (obj._doc && obj._doc.error)) {
return 'FailedValidation';
}
return 'SuccessfullValidation';
},
}
类型定义
type SuccessfullValidation {
id: ID!
filter: Filter!
field: Field!
}
type TestError {
hint: String!
details: String!
}
type FailedValidation {
id: ID!
filter: Filter!
field: Field!
error: TestError
}
union FieldValidation = SuccessfullValidation | FailedValidation
extend type Query {
getFieldValidations: [FieldValidation!]!
}
type FormValidation {
id: ID!
fieldValidations: [FieldValidation!]!
}
input ValidateFormInputFields {
id: String!
value: String!
}
input ValidateFormInput {
fields: [ValidateFormInputFields!]!
userId: Int!
}
extend type Mutation {
validateForm(input: ValidateFormInput!): FormValidation!
}
这是预期的行为。来自 spec:
Fragments can be defined inline within a selection set. This is done to conditionally include fields based on their runtime type.
类型条件(即 on FailedValidation
)只是一种根据运行时类型过滤 字段 解析的方法。它们不是过滤实际结果列表的方法——GraphQL 中没有 built-in 过滤。
如果您想过滤 fieldValidations
返回的 FieldValidation
列表,您需要向该字段添加某种参数,然后实施适当的解析器逻辑。
顺便说一句,您不会看到 non-null 字段为 null 的验证错误,除非该字段实际被请求并且解析为 null。在这种情况下,您在内联片段上的类型条件实际上导致了一个空的选择集——从 GraphQL 的角度来看,没有请求 id
字段,因此它不会对其进行空检查。
我正在尝试使用 graphql 实现表单验证。出于某种原因,当我 运行 这个查询时:
mutation validateForm($input: ValidateFormInput!) {
test: validateForm(
input: $input
) {
id
fieldValidations {
... on FailedValidation {
id
}
}
}
}
并且有一个字段验证没有错误 ('SuccessfullValidation') 它 returns {id:'some-id',fieldValidations:[{}]} 当它应该返回 {id :'some-id',fieldValidations:[]}。这对我来说尤其没有任何意义,因为 ID 在两个字段中都被标记为不可空字段,但是我没有收到任何错误。
解析器
FieldValidation: {
__resolveType(obj: any) {
if (obj.error || (obj._doc && obj._doc.error)) {
return 'FailedValidation';
}
return 'SuccessfullValidation';
},
}
类型定义
type SuccessfullValidation {
id: ID!
filter: Filter!
field: Field!
}
type TestError {
hint: String!
details: String!
}
type FailedValidation {
id: ID!
filter: Filter!
field: Field!
error: TestError
}
union FieldValidation = SuccessfullValidation | FailedValidation
extend type Query {
getFieldValidations: [FieldValidation!]!
}
type FormValidation {
id: ID!
fieldValidations: [FieldValidation!]!
}
input ValidateFormInputFields {
id: String!
value: String!
}
input ValidateFormInput {
fields: [ValidateFormInputFields!]!
userId: Int!
}
extend type Mutation {
validateForm(input: ValidateFormInput!): FormValidation!
}
这是预期的行为。来自 spec:
Fragments can be defined inline within a selection set. This is done to conditionally include fields based on their runtime type.
类型条件(即 on FailedValidation
)只是一种根据运行时类型过滤 字段 解析的方法。它们不是过滤实际结果列表的方法——GraphQL 中没有 built-in 过滤。
如果您想过滤 fieldValidations
返回的 FieldValidation
列表,您需要向该字段添加某种参数,然后实施适当的解析器逻辑。
顺便说一句,您不会看到 non-null 字段为 null 的验证错误,除非该字段实际被请求并且解析为 null。在这种情况下,您在内联片段上的类型条件实际上导致了一个空的选择集——从 GraphQL 的角度来看,没有请求 id
字段,因此它不会对其进行空检查。