GraphQL 抽象类型 X 必须在运行时解析为字段 Y 的对象类型

问题描述

我在一个项目中使用 GraphQL,我试图根据响应返回错误和数据。下面是我的架构的示例。

interface Error {
 message: String!
 status: String!
}

type UserExistError implements Error {
  message: String!
  status: String!
}

type AccountExistError implements Error {
  message: String!
  status: String!
}

type AuthPayload {
  user: User
  token: String!
}

union AuthError = UserExistError | AccountExistError

type UserResult {
  errors: AuthError!
  user: AuthPayload!
}

type Mutation {
  createuser(data: UserInput!): UserResult!
}

然后我有一个像这样的解析器功能

export default function makeAddUser({ userRepo }) {
  return async function createuser(parent,args,context,info) {
    const body = makeUser({ ...args.data })
    const response = await bankService.createAcct({
      firstName: body.getFirstName(),lastName: body.getLastName(),email: body.getEmail()
    })

    if (response.status === '400') {
      const errors = {
        __typename: 'AccountExistError',status: response.status,message: response.error.Message,}
      return { errors }
    }

   
    const user = await userRepo.insert(...data)
    const token = generatetoken()
    return { __typename: 'AuthPayload',user,token}
  }
}

这个函数然后像这样传递给解析器对象:

const resolver = {
 Mutation: {
 createuser
},Query: {}
}

然后传递给 apollo-server 配置对象。

然后在 GraphQL Playground 上,我像这样尝试变异

mutation {
  createuser(
    data: {
      firstName: "john"
      lastName: "doe"
      email: "john@gmail.com"
      password: "somepass1234"
      dateOfBirth: "2020-01-03"
    }
  ) {
    errors {
      ... on AccountExistError {
        message
      }
    }
    user {
      user {
        email
      }
    }
  }
}

但是运行那个突变,我得到这个错误

"Abstract type "AuthError" must resolve to an Object type at runtime for field "UserResult.errors". Either the "AuthError" type should provide a "resolveType" function or each possible type should provide an "isTypeOf" function.",

我试图通过 Apollo-server 文档了解使用联合类型,但似乎仍然不了解如何解决这个问题。欢迎任何帮助。谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)