做到这一点的最短方法是
@Get(':id')
async findOneById(@Param() params): Promise<User> {
const user: User = await this.userService.findOneById(params.id);
if (user === undefined) {
throw new BadRequestException('Invalid user');
}
return user;
}
这里装饰器没有意义,因为它具有相同的代码。
Note: BadRequestException
是从进口的@nestjs/common
;
Edit
经过一段时间的研究,我提出了另一个解决方案,它是 DTO 中的装饰器:
import { registerDecorator, ValidationArguments, ValidationOptions, ValidatorConstraint } from 'class-validator';
import { createQueryBuilder } from 'typeorm';
@ValidatorConstraint({ async: true })
export class IsValidIdConstraint {
validate(id: number, args: ValidationArguments) {
const tableName = args.constraints[0];
return createQueryBuilder(tableName)
.where({ id })
.getOne()
.then(record => {
return record ? true : false;
});
}
}
export function IsValidId(tableName: string, validationOptions?: ValidationOptions) {
return (object, propertyName: string) => {
registerDecorator({
target: object.constructor,
propertyName,
options: validationOptions,
constraints: [tableName],
validator: IsValidIdConstraint,
});
};
}
然后在你的 DTO 中:
export class GetUserParams {
@IsValidId('user', { message: 'Invalid User' })
id: number;
}
希望它能帮助某人。