You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apollo Server未按预期返回Union类型,求原因及解决方法

问题分析与修正方案

问题原因

  • 类型定义不匹配:你的Query中validateUser字段的返回类型写的是User,但实际要返回的是UserOrError联合类型。GraphQL严格按照类型定义处理返回值,所以即便返回错误对象,也会按User类型解析,导致__typename始终为"User"。
  • 错误对象缺少类型标识:返回错误对象时仅提供了message字段,未明确指定__typename为"UserNotFoundError"。Apollo解析联合类型时需要明确的类型标识来区分分支,否则会默认匹配联合类型中的第一个类型(即User)。

修正方法

1. 修正类型定义(typeDefs)

将Query里的validateUser返回类型改为UserOrError:

type Query {
  allUsers: [User!]!
  userByEmail(email: String!): User!
  validateUser(email: String!, password: String!): UserOrError # 修改为联合类型
}

2. 修正解析器(Resolver)

返回错误对象时手动添加__typename字段,明确指定类型:

async validateUser(
  _: undefined,
  { email, password }: { email: string; password: string }
) {
  const user = await prisma.user.findUnique({
    where: {
      email,
    },
  });
  console.log('user before ', user);
  if (!user || user.password !== password) {
    // 添加__typename字段标识错误类型
    return { __typename: "UserNotFoundError", message: 'Invalid user or password' };
  }
  return user;
}

验证效果

修正后,验证失败时返回结果的__typename会变为"UserNotFoundError",验证成功时则为"User",完全符合联合类型的预期行为。

内容的提问来源于stack exchange,提问作者currenthandle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:40:40