返された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;
}
_
このようにモデルの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']
})
_
パッケージを使用できます https://github.com/typestack/class-transformer
デコレータを使用してプロパティを除外したり、グループを使用してプロパティを除外したりできます。