Я пытаюсь реализовать проверку формы с помощью graphql. По какой-то причине, когда я запускаю этот запрос:
mutation validateForm($input: ValidateFormInput!) {
test: validateForm(
input: $input
) {
id
fieldValidations {
... on FailedValidation {
id
}
}
}
}
и есть одна проверка поля без ошибок («SuccessfullValidation»), она возвращает {id: «some-id», fieldValidations: [{}]}, когда она должна возвращать {id: «some-id», fieldValidations: [] }. Это особенно не имеет для меня никакого смысла, потому что идентификатор помечен как поле, не допускающее значение NULL, в обоих полях, однако я не получаю никаких ошибок.
Резольверы
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!
}


Это ожидаемое поведение. Из спец.:
Fragments can be defined inline within a selection set. This is done to conditionally include fields based on their runtime type.
Условия типа (например, on FailedValidation) — это просто способ отфильтровать, какие поля разрешаются на основе типа среды выполнения. Это не способ фильтрации фактического списка результатов — в GraphQL нет встроенной фильтрации.
Если вы хотите отфильтровать список FieldValidation, возвращаемый fieldValidations, вам нужно добавить какой-либо аргумент в поле, а затем реализовать соответствующую логику преобразователя.
Кроме того, вы не увидите ошибку проверки для ненулевого поля, равного нулю, если только это поле действительно не запрошено и оно не разрешается как нуль. В этом случае ваше условие типа во встроенном фрагменте фактически привело к пустому набору выбора — с точки зрения GraphQL поле id не запрашивалось, и поэтому оно не выполняет для него проверку на нулевое значение.