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

ApolloGraphQL Mutation满足条件时未返回错误信息求助

修复登录/注册Mutation的错误处理问题

问题分析

  1. 登录用户名错误处理失效:使用em.findOneOrFail会在用户不存在时直接抛出异常,跳过自定义错误返回逻辑,无法返回"username incorrect"的自定义错误。
  2. 错误信息无法传递:FieldError类的message字段缺少@Field()装饰器,GraphQL不会序列化该字段,前端无法获取错误提示文本。
  3. 注册错误无提示:同样因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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:31:33