Graphql __resolveType返回空对象
我正在尝试使用graphql实现表单验证。出于某种原因,当我运行此查询时:Graphql __resolveType返回空对象,graphql,apollo,Graphql,Apollo,我正在尝试使用graphql实现表单验证。出于某种原因,当我运行此查询时: mutation validateForm($input: ValidateFormInput!) { test: validateForm( input: $input ) { id fieldValidations { ... on FailedValidation { id
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!
}
类型定义
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!
}
这是预期的行为。从: 片段可以在选择集中内联定义。这样做是为了根据字段的运行时类型有条件地包括字段 类型条件(即失败验证时的
)只是根据运行时类型筛选要解析的字段的一种方法。它们不是过滤实际结果列表的方法——GraphQL中没有内置过滤
如果要筛选由字段验证
返回的字段验证
列表,则需要向字段添加某种参数,然后实现相应的解析器逻辑
另一方面,除非实际请求了非空字段并将其解析为空,否则不会看到该字段为空的验证错误。在本例中,内联片段上的类型条件实际上导致了一个空的选择集——从GraphQL的角度来看,id
字段没有被请求,因此它不会对其执行空检查