ParseObjectIdPipe для ObjectID MongoDB - PullRequest
       59

ParseObjectIdPipe для ObjectID MongoDB

2 голосов
/ 19 февраля 2020

Я хочу создать 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. Но, возможно, этот код может помочь в целях проверки и преобразования ...

1 Ответ

0 голосов
/ 20 февраля 2020

Так что для проверки Body я могу использовать декоратор IsMongoId() отсюда

https://github.com/typestack/class-validator#manual -валификация

Проверка будет выглядеть как

import { IsMongoId } from 'class-validator';
import { ObjectID } from 'typeorm';

export class FooDTO {
  @IsMongoId()
  public bar: ObjectID;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...