我想用 TypeORM 和 MongoDB 创建一个 NestJs API。我的实体 id 字段的类型为ObjectID
. 控制器路由应该在将传入的 id 传递给服务之前验证它们。我知道 Nest 附带 ParseIntPipe 和 ParseUUIDPipe 但据我所知,我没有什么可以用于 MongoDBs ObjectID
。
因此,我为这些字段创建了自己的管道,如此处所述https://docs.nestjs.com/pipes#transformation-use-case
import { PipeTransform, Injectable, BadRequestException } from '@nestjs/common';
import { ObjectID } from 'typeorm';
@Injectable()
export class ParseObjectIdPipe implements PipeTransform<any, ObjectID> {
transform(value: any): ObjectID {
const validObjectId: boolean = ObjectID.isValid(value);
if (validObjectId) {
throw new BadRequestException('Invalid ObjectId');
}
const objectId: ObjectID = ObjectID.createFromHexString(value);
return objectId;
}
}
并希望这能解决问题,即使是边缘情况。我可以将它用于我的路线参数,例如
@Get(':id')
public getUserById(@Param('id', ParseObjectIdPipe) id: ObjectID): Promise<User> {
return this.usersService.getUserById(id);
}
我遇到的问题是某些路线需要Body
验证。我使用这里描述的类验证器包
https://docs.nestjs.com/techniques/validation
似乎我必须为这些ObjectID
字段创建自己的类验证器装饰器,但这应该没问题。也许我会在这里找到一些关于如何做到这一点的东西https://github.com/typestack/class-validator#custom-validation-classes。但是如何将这些字段转换为类型ObjectID
?我以后也可以使用自定义管道吗?
更新:
我还尝试通过 class-transformer 包转换值。所以这个代码是
import { ObjectID } from 'typeorm';
import { Type, Transform } from 'class-transformer';
import { BadRequestException } from '@nestjs/common';
export class FooDTO {
@Type(() => ObjectID)
@Transform(bar => {
if (ObjectID.isValid(bar)) {
throw new BadRequestException('Invalid ObjectId');
}
return ObjectID.createFromHexString(bar);
})
public bar: ObjectID;
}
不幸的是,价值bar
总是undefined
。但也许这段代码可能有助于验证和转换目的......