Я хочу создать Nest Js API с TypeORM и MongoDB. Мои поля идентификатора сущности имеют тип ObjectID
. Маршруты контроллера должны проверять входящие идентификаторы, прежде чем передавать их сервисам. Я знаю, что Nest поставляется с ParseIntPipe и ParseUUIDPipe, но, насколько я знаю, я ничего не могу использовать для MongoDB 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
. Я использую пакет class-validator, как описано здесь
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
. Но, возможно, этот код может помочь в целях проверки и преобразования ...