闘技場
- Nest.js
- TypeORM
- mongodb (AWS DocumentDB)
- Docker
チャレンジャー紹介
絶対に秘匿したい俺
- 秘匿したいレベル100
- フロントに
フィールド名が_id
かつmongodb固有のHexString
が露出することで一族が滅びた過去を持つ孤高の戦士 - そもそも_idを別の名前で利用したかった(ライブラリラッパーでもいい)
絶対に秘匿させたくないmongodbおよびTypeORM
- 秘匿したくないレベル100
- 素晴らしいObjectIDな仕組みをもって高橋一族を滅びした魔女の末裔
- どうあがいても _id で保持してしまう
結果
絶対に秘匿したい俺の勝利
- 保存時とかは id -> _idをするのは我慢した
- class-transformerの仕組みを活用
ダイジェスト
ここからはダイジェストでお送りいたします。
classToPlain()を駆使して加工した俺
SomeEntity.ts
import { Entity, ObjectIdColumn } from 'typeorm';
import { ObjectId } from 'mongodb';
@Entity()
export class SomeEntity() {
@ObjectIdColumn()
@Exclude()
_id?: ObjectId;
@Expose()
public get id() {
return this._id ? this._id.toHexString() : undefined;
}
}
これをclass-transformerの classToPlain()
したあとでレスポンスを返すことで無事勝利
解説の山田さん「classToPlain()されたときの挙動を @Expose()
@Exclude()
の両呪文をうまくつかって隠蔽していますね」
@Exclude(): classToPlain() したときにフィールドごと吹っ飛ばす呪文
@Expose(): classToPlain() したときにフィールドと値を付け足す呪文
classToPlain()をインターセプトした俺
class-to-plain.interceptor.ts
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { classToPlain } from 'class-transformer';
@Injectable()
export class ClassToPlainInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
return next.handle().pipe(map(data => classToPlain(data)));
}
}
解説の山田さん「Controllerでいちいち return classToPlain()
したくなかったことが伺えますね。インターセプターがうまく機能しているように見えます」