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; } }
关键改动说明:
- 提前校验时机:把adminID的校验逻辑移到最开头,确保不符合条件的请求不会执行后续的哈希生成和数据库写入操作,避免无效数据留存
- 正确调用startsWith:使用
dto.adminID?.startsWith('22'),既做了空值安全判断(防止adminID为undefined/null时报错),又明确指定了要校验的前缀'22' - 完善错误抛出:在catch块末尾重新抛出其他错误,确保自定义的
ForbiddenException能正常返回给前端
内容的提问来源于stack exchange,提问作者D12
相关产品推荐
相关产品推荐

