__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 字段,因此它不会对其进行空检查。