сопоставить объект с интерфейсом и удалить все ключи, которые не существуют - PullRequest
1 голос
/ 08 октября 2019

Я хотел бы создать API NestJS с TypeORM и сопоставить пользователя базы данных с моделью ответа, отправляемой клиенту. Моя UserEntity просто содержит некоторую базовую информацию

@Entity('User')
export class UserEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  username: string;

  @Column()
  passwordHash: string;

  @Column()
  passwordSalt: string;
}

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

export interface UserRO {
  id: number;
  username: string;
}

При вызове GET / users я ожидал бы набор UserRO. Поэтому я выбрал

  public async find(): Promise<UserRO[]> {
    return this.usersRepository.find(); // returning a list of UserEntities
  }

К сожалению, сопоставления не было, поэтому объекты ответа все еще содержали информацию о пароле. Я доказал это с помощью этого кода

  public async find(): Promise<UserRO[]> {
    const dbUsers: UserEntity[] = await this.usersRepository.find();
    const roUsers: UserRO[] = dbUsers;
    console.log(dbUsers);
    console.log(roUsers); // still holding the password information

    return roUsers;
  }

Я также добавил быстрое исправление, используя функцию карты

  public async find(): Promise<UserRO[]> {
    const dbUsers: UserEntity[] = await this.usersRepository.find();
    const roUsers: UserRO[] = dbUsers.map((dbUser: UserEntity) => {
      return {
        id: dbUser.id,
        username: dbUser.username,
      };
    });
    console.log(dbUsers);
    console.log(roUsers); // not holding the password information anymore

    return roUsers;
  }

Мой вопрос: действительно ли я должен делать это вручную? Я надеялся, что TypeScript удалит или проигнорирует все «неизвестные» ключи и получит значения только из соответствующих ключей.

1 Ответ

3 голосов
/ 08 октября 2019

В настройках столбца можно добавить параметр select: false, чтобы избежать включения поля при выборе объекта из базы данных: Скрытые столбцы

...