https://docs.3rcd.com/nestjs/chapter23
用户模块的更新账号接口是这样的
@Patch()
@ApiBearerAuth()
@SerializeOptions({ groups: ['user-detail'] })
async update(@RequestUser() user: ClassToPlain<UserEntity>, @Body() data: UpdateAccountDto) {
return this.userService.update({ id: user.id, ...pick(data, ['username', 'nickname']) });
}
UpdateAccountDto的username有做校验
@DtoValidation({
groups: [UserValidateGroups.ACCOUNT_UPDATE],
whitelist: false,
})
export class UpdateAccountDto extends PickType(UserCommonDto, ['username', 'nickname']) {}
@IsUnique(
{ entity: UserEntity },
{
groups: [UserValidateGroup.USER_CREATE, UserValidateGroup.USER_REGISTER],
message: '该用户名已被注册',
},
)
@IsUniqueExist(
{ entity: UserEntity, ignore: 'id' },
{ groups: [UserValidateGroup.USER_UPDATE], message: '该用户名已被注册' },
)
@IsUniqueExist(
{ entity: UserEntity, ignore: 'id', ignoreKey: 'userId' },
{ groups: [UserValidateGroup.ACCOUNT_UPDATE], message: '该用户名已被注册' },
)
@Length(4, 30, { always: true, message: '用户名长度必须为$constraint1到$constraint2' })
@IsOptional({ groups: [UserValidateGroup.USER_UPDATE, UserValidateGroup.ACCOUNT_UPDATE] })
username: string;
group是UserValidateGroups.ACCOUNT_UPDATE,就是更新用户名的时候会对唯一性进行校验
但是id并不是在dto里传的,而是通过注解直接从request中获取,导致IsUniqueExist进行校验的时候,获取不到id对应的值,直接返回校验失败
async validate(value: any, args?: ValidationArguments): Promise<boolean> {
const config: Omit<Condition, 'entity'> = {
ignore: 'id',
property: args.property,
};
const condition = ('entity' in args.constraints[0]
? merge(config, args.constraints[0])
: { ...config, entity: args.constraints[0] }) as unknown as Required<Condition>;
if (!condition.entity) {
return false;
}
const ignoreValue = (args.object as any)[ //❗️ 这里获取ignoreValue时,因为args.object没有用户id,所以是undefined,导致校验直接返回false
isNil(condition.ignoreKey) ? condition.ignore : condition.ignoreKey
];
if (ignoreValue === undefined) {
return false;
}
const repo = this.dataSource.getRepository(condition.entity);
return isNil(
await repo.findOne({
where: { [condition.property]: value, [condition.ignore]: Not(ignoreValue) },
withDeleted: true,
}),
);
}
这里是不是只能在UpdateAccountDto里增加id才能解决的?
@Cloneable 麻烦看下这个问题