__resolveType返回空对象

时间:2019-05-20 21:40:35

标签: graphql apollo

我正在尝试使用graphql进行表单验证。由于某些原因,当我运行此查询时:

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

并且有一个没有错误的字段验证('SuccessfullValidation'),当它应该返回{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!
}

1 个答案:

答案 0 :(得分:1)

这是预期的行为。来自spec

  

可以在选择集中内联定义片段。这样做是为了根据字段的运行时类型有条件地包括这些字段。

类型条件(即on FailedValidation)只是根据运行时类型来过滤要解析哪些字段的一种方法。它们不是筛选实际结果列表的方法-GraphQL中没有内置的筛选器。

如果要过滤FieldValidation返回的fieldValidations的列表,则需要在字段中添加某种参数,然后实现适当的解析器逻辑。

顺便说一句,除非实际请求非null字段为null,否则不会看到验证错误。在这种情况下,内联片段上的类型条件实际上导致了一个空的选择集-从GraphQL的角度来看,id字段未被请求,因此它不会对其进行空检查。