web-dev-qa-db-ja.com

コントローラーJSONから返されるエンティティフィールドを除外する方法。 NestJS + Typeorm

返されたJSONからパスワードフィールドを除外します。 NestJSとTypeormを使用しています。

この質問 で提供されるソリューションは、私やNestJSでは機能しません。必要に応じてコードを投稿できます。他のアイデアや解決策はありますか?ありがとう。

class-transformer ライブラリを利用するインターセプターを作成することをお勧めします。

_@Injectable()
export class TransformInterceptor implements NestInterceptor {
  intercept(
    context: ExecutionContext,
    call$: Observable<any>,
  ): Observable<any> {
    return call$.pipe(map(data => classToPlain(data)));
  }
}
_

次に、@Exclude()デコレータを使用してプロパティを単に除外します。次に例を示します。

_import { Exclude } from 'class-transformer';

export class User {
    id: number;
    email: string;

    @Exclude()
    password: string;
}
_
10

このようにモデルのtoJSONメソッドを上書きすることができます。

@Entity()
export class User extends BaseAbstractEntity implements IUser {
  static passwordMinLength: number = 7;

  @ApiModelProperty({ example: faker.internet.email() })
  @IsEmail()
  @Column({ unique: true })
  email: string;

  @IsOptional()
  @IsString()
  @MinLength(User.passwordMinLength)
  @Exclude({ toPlainOnly: true })
  @Column({ select: false })
  password: string;

  @IsOptional()
  @IsString()
  @Exclude({ toPlainOnly: true })
  @Column({ select: false })
  passwordSalt: string;

  toJSON() {
    return classToPlain(this);
  }

  validatePassword(password: string) {
    if (!this.password || !this.passwordSalt) {
      return false;
    }
    return comparedToHashed(password, this.password, this.passwordSalt);
  }
}

PlainToClassのclass-transformerメソッドを@ Exclude({toPlainOnly:true})とともに使用すると、パスワードはJSON応答から除外されますが、モデルインスタンスで使用できます。エンティティのすべてのモデル構成を保持するため、このソリューションが好きです。

カミルの答え への追加として:

独自のインターセプターを作成する代わりに、組み込みのClassSerializerInterceptorを使用できるようになりました。 シリアライゼーションのドキュメント を参照してください。

_@UseInterceptors(ClassSerializerInterceptor)
_

コントローラークラスまたはその個々のメソッドで使用できます。そのようなメソッドによって返された各エンティティは、クラス変換によって変換されます。


コントローラーまたはそのメソッドで@SerializeOptions()を定義することで、その動作をカスタマイズできます。

_@SerializeOptions({
  excludePrefixes: ['_'],
  groups: ['admin']
})
_
4
Kim Kern

パッケージを使用できます https://github.com/typestack/class-transformer

デコレータを使用してプロパティを除外したり、グループを使用してプロパティを除外したりできます。

0
João Silva