__resolveType, возвращающий пустые объекты - PullRequest
1 голос
/ 21 мая 2019

Я пытаюсь реализовать проверку формы с помощью graphql.По какой-то причине, когда я запускаю этот запрос:

mutation validateForm($input: ValidateFormInput!) {
    test: validateForm(
       input: $input
    ) {
        id
        fieldValidations {
            ... on FailedValidation {
                id
            }
        }
    }
  }

и существует одна проверка поля без ошибок ('SuccessfullValidation'), он возвращает {id: 'some-id', fieldValidations: [{}]}когда он должен возвращать {id: 'some-id', fieldValidations: []}.Это особенно не имеет никакого смысла для меня, потому что ID помечен как ненулевое поле в обоих полях, однако я не получаю никаких ошибок.

Resolvers

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!
}

1 Ответ

1 голос
/ 21 мая 2019

Это ожидаемое поведение.Из spec :

Фрагменты могут быть определены внутри набора выбора.Это делается для условного включения полей в зависимости от их типа во время выполнения.

Типовые условия (т. Е. on FailedValidation) - это просто способ отфильтровать то, что поля разрешаются в зависимости от времени выполнения.тип.Они не являются способом фильтрации фактического списка результатов - в GraphQL нет встроенной фильтрации.

Если вы хотите отфильтровать список FieldValidation s, возвращаемых fieldValidations, выВам нужно будет добавить какой-то аргумент в поле и затем реализовать соответствующую логику распознавателя.

Кроме того, вы не увидите ошибку проверки для ненулевого поля, являющегося нулевым, если это поле не являетсяна самом деле запрашивается, и он разрешается до нуля.В этом случае условие вашего типа во встроенном фрагменте фактически привело к пустому набору выбора - с точки зрения GraphQL, поле id не было запрошено, и поэтому оно не проверяет его на ноль.

...