微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。