@mr-scrpt

Как правильно сделать сериализацию в nestjs?

Я получаю данные из монги через nestjs. Допустим хочу получить всех пользователей Вот контролле, который обрабатывает эндпоинт

@Get('/getAll')
  async getAll() {
    return this.userService.getAll();
  }

Вот сервис который получает данные из монги с помощью монгуса

async getAll(): Promise<User[]> {
    try {
      return await this.userModel.find().exec();
    } catch (error) {
      throw new BadRequestException('Users not found');
    }
  }

Вот объект одного пользователя в ответе:

{
    
    "lastname": "Gabbana",
    "_id": "5f782ace2cdfcd297c373ba6",
    "name": "Dolce",        
    "password": "$2b$10$DSomsGAk4FuXUH6Knnmdz.9L2DWlFTfH.VOIM8VKYlDroOwKeh7kW",
    "__v": 0
 }

Все работает как нужно. Но я хочу сделать сериализацию данных. В документации nestjs рекомендуют использовать декоратор @UseInterceptors(ClassSerializerInterceptor) для контроллера. А в модели нужно над полем которое нужно исключать при сериализации нужно применить декоратор @Exclude()
То есть вот так:

@Schema()
export class User extends Document {
  @Prop()
  name: string;

  @Prop({ default: '' })
  lastname: string;
  
  @Exclude()
  @Prop()
  password: string;
}

export const UserSchema = SchemaFactory.createForClass(User);


Но проблема в том, что теперь я получаю очень большой объект по каждому пользователю, в котором масса ненужной мне информации и при этом при всем, поле пароля не исключено из ответа, то есть и сериализация не прошла и ответ получается не тем.

{
    "$__": {
      "strictMode": true,
      "selected": {},
      "getters": {},
      "_id": {
        "_bsontype": "ObjectID",
        "id": {
          "type": "Buffer",
          "data": [
            95,
            120,
            42,
            206,
            44,
            223,
            205,
            41,
            124,
            55,
            59,
            166
          ]
        }
      },
      "wasPopulated": false,
      "activePaths": {
        "paths": {
          "role": "init",
          "registerAt": "init",
          "status": "init",
          "lastname": "init",
          "_id": "init",
          "name": "init",
          "email": "init",
          "phone": "init",
          "password": "init",
          "__v": "init"
        },
        "states": {
          "ignore": {},
          "default": {},
          "init": {
            "_id": true,
            "role": true,
            "registerAt": true,
            "status": true,
            "lastname": true,
            "name": true,
            "email": true,
            "phone": true,
            "password": true,
            "__v": true
          },
          "modify": {},
          "require": {}
        },
        "stateNames": [
          "require",
          "modify",
          "init",
          "default",
          "ignore"
        ]
      },
      "pathsToScopes": {},
      "cachedRequired": {},
      "session": null,
      "$setCalled": [],
      "emitter": {
        "_events": {},
        "_eventsCount": 0,
        "_maxListeners": 0
      },
      "$options": {
        "skipId": true,
        "isNew": false,
        "willInit": true,
        "defaults": true
      }
    },
    "isNew": false,
    "$locals": {},
    "$op": null,
    "_doc": {     
      
      "lastname": "Gabbana",
      "_id": {
        "_bsontype": "ObjectID",
        "id": {
          "type": "Buffer",
          "data": [
            95,
            120,
            42,
            206,
            44,
            223,
            205,
            41,
            124,
            55,
            59,
            166
          ]
        }
      },
      "name": "Dolce",
      
      
      "password": "$2b$10$DSomsGAk4FuXUH6Knnmdz.9L2DWlFTfH.VOIM8VKYlDroOwKeh7kW",
      "__v": 0
    },
    "$init": true
  }

Вот такой объект приходит для каждого юзера. В документации такого не происходит и в гугле я такого не нашел, везде приходит нормальный ответ. Подскажите пожалуйста, что я делаю не так?
  • Вопрос задан
  • 28 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы