NestJS 验证 mongo objectid 的@param 格式
NestJS validate @param format of mongo objectid
我正在使用 mongodb 作为我的数据库使用 nestjs 框架创建一个应用程序。在我的 CRUD findOne 方法中,我想验证发送的 ID 是 Mongo ObjectID 和 return 400 如果不是(默认情况下它 returns 500 如果你让它流过)。我可以手动检查这是,但是有没有办法注释参数以自动进行此验证?
@Get(':id')
findOne(@Param('id') id: string) {
return this.usersService.findOne(id);
}
您可以使用 class 验证器和转换,如下所示:
控制器:
@Get(':id')
findOne(@Param() params: OnlyIDParamDTO) {
return this.usersService.findOne(params.id);
}
DTO:
export class OnlyIDParamDTO {
@ApiProperty({
description: 'Id',
required: true,
type: String,
default: '61d9cfbf17ed7311c4b3e485',
})
@IsMongoId()
@IsString()
@Transform((value) => SafeMongoIdTransform(value))
id: string;
}
变换:
export const SafeMongoIdTransform = ({ value }) => {
try {
if (
Types.ObjectId.isValid(value) &&
new Types.ObjectId(value).toString() === value
) {
return value;
}
throw new BadRequestException('Id validation fail');
} catch (error) {
throw new BadRequestException('Id validation fail');
}
};
您可以在这里阅读更多内容:https://docs.nestjs.com/pipes#object-schema-validation
我正在使用 mongodb 作为我的数据库使用 nestjs 框架创建一个应用程序。在我的 CRUD findOne 方法中,我想验证发送的 ID 是 Mongo ObjectID 和 return 400 如果不是(默认情况下它 returns 500 如果你让它流过)。我可以手动检查这是,但是有没有办法注释参数以自动进行此验证?
@Get(':id')
findOne(@Param('id') id: string) {
return this.usersService.findOne(id);
}
您可以使用 class 验证器和转换,如下所示:
控制器:
@Get(':id')
findOne(@Param() params: OnlyIDParamDTO) {
return this.usersService.findOne(params.id);
}
DTO:
export class OnlyIDParamDTO {
@ApiProperty({
description: 'Id',
required: true,
type: String,
default: '61d9cfbf17ed7311c4b3e485',
})
@IsMongoId()
@IsString()
@Transform((value) => SafeMongoIdTransform(value))
id: string;
}
变换:
export const SafeMongoIdTransform = ({ value }) => {
try {
if (
Types.ObjectId.isValid(value) &&
new Types.ObjectId(value).toString() === value
) {
return value;
}
throw new BadRequestException('Id validation fail');
} catch (error) {
throw new BadRequestException('Id validation fail');
}
};
您可以在这里阅读更多内容:https://docs.nestjs.com/pipes#object-schema-validation