ApolloGraphQL Mutation满足条件时未返回错误信息求助
修复登录/注册Mutation的错误处理问题
问题分析
- 登录用户名错误处理失效:使用
em.findOneOrFail会在用户不存在时直接抛出异常,跳过自定义错误返回逻辑,无法返回"username incorrect"的自定义错误。 - 错误信息无法传递:
FieldError类的message字段缺少@Field()装饰器,GraphQL不会序列化该字段,前端无法获取错误提示文本。 - 注册错误无提示:同样因
FieldError的message未装饰,满足错误条件时返回的错误信息无法被接收,表现为返回null用户。
修复方案
1. 完善FieldError类的字段装饰
给message字段添加@Field()装饰器,确保GraphQL能正确返回错误信息:
@ObjectType() class FieldError { @Field() field: string; @Field() // 新增该装饰器 message: string; }
2. 修复登录方法的用户查询逻辑
将em.findOneOrFail替换为em.findOne,避免抛出异常,让自定义错误处理逻辑生效:
@Mutation(() => UserResponse) async login( @Arg('options') options: UsernamePasswordInput, @Ctx() { em }: MyContext ): Promise<UserResponse> { // 替换findOneOrFail为findOne,找不到用户时返回null const user = await em.findOne(User, { username: options.username, }); if (!user) { return { errors: [ { field: 'username', message: 'incorrect username', }, ], }; } const valid = await argon2.verify(user.password, options.password); if (!valid) { return { errors: [ { field: 'password', message: 'incorrect password', }, ], }; } return { user, }; }
修复后的效果
- 输入错误用户名时返回:
{ "data": { "login": { "errors": [ { "field": "username", "message": "incorrect username" } ], "user": null } } }
- 输入错误密码时返回:
{ "data": { "login": { "errors": [ { "field": "password", "message": "incorrect password" } ], "user": null } } }
- 注册不满足条件(如用户名过短)时返回:
{ "data": { "register": { "errors": [ { "field": "username", "message": "length must be greater than 2" } ], "user": null } } }
内容的提问来源于stack exchange,提问作者Bav Kudhail
相关产品推荐
相关产品推荐

