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
相关产品推荐
相关产品推荐

