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

Nest.js注册接口adminID校验问题:需以22开头否则报错

修正Nest.js注册接口adminID前缀校验问题

你的代码确实存在两处关键问题,导致adminID校验失效:

  • 校验逻辑放在了用户创建之后:不管adminID是否合法,用户都会被写入数据库
  • startsWith方法调用错误:既没传入要校验的前缀'22',还错误地判断方法本身是否存在,而非调用方法判断结果

以下是修正后的完整代码:

async signup(dto: AuthDto) {
  try {
    // 先校验adminID前缀,不符合直接抛错
    if (!dto.adminID?.startsWith('22')) {
      throw new ForbiddenException('adminID必须以22开头');
    }

    // 生成密码哈希
    const hash = await argon.hash(dto.password);

    // 创建admin用户
    const admin = await this.prisma.admin.create({
      data: {
        adminID: dto.adminID,
        email: dto.email,
        firstName: dto.firstName,
        lastName: dto.lastName,
        hash,
      },
    });

    return this.adminToken(
      admin.id,
      admin.adminID,
      admin.email,
      admin.firstName,
      admin.lastName,
    );
  } catch (error) {
    if (error instanceof PrismaClientKnownRequestError) {
      if (error.code === 'P2002') {
        throw new ForbiddenException(
          '该账号信息已被其他用户使用!',
        );
      }
    }
    // 重新抛出其他错误,包括自定义的ForbiddenException
    throw error;
  }
}

关键改动说明:

  1. 提前校验时机:把adminID的校验逻辑移到最开头,确保不符合条件的请求不会执行后续的哈希生成和数据库写入操作,避免无效数据留存
  2. 正确调用startsWith:使用dto.adminID?.startsWith('22'),既做了空值安全判断(防止adminID为undefined/null时报错),又明确指定了要校验的前缀'22'
  3. 完善错误抛出:在catch块末尾重新抛出其他错误,确保自定义的ForbiddenException能正常返回给前端

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:45:30