NestJSでmiddlewareとguardとdecoratorを活用してcurrentUserを実装した話。NestJSでmiddlewareとguardとdecoratorを活用してcurrentUserを実装した話。2020-01-24NestJSでmiddlewareとguardとdecoratorを活用してcurrentUserを実装した話。Web開発TwitterFacebookHatenaPocketこんにちは、たわです。今回はNestJSでcurrentUserを使えるようにしてみたのでその方法について書きます。現状currentUser用のデコレーターまとめNestJSとはNestJSNestJSはTypeScirptでいい感じにバックエンドを実装することができるフレームワークです。Railsやその他の有名フレームワークと比べると、まだ新しく情報があまりネットにも落ちていないので、自分なりの実装ですが参考になればと思います。Keyによって行っていることとします。Cookie等で行う場合もあるかもしれませんが、その場合は適宜読み替えて見てもらえればと思います。実装方法それでは、順番に実装方法について説明します。ミドルウェア(middleware)を作るまずは、currentUserを取得するために専用のミドルウェアを作ります。以下のように設定しました。}}this.usersService.findByApiKey(apiKey)は実装によりけりと思いますが、DBにアクセスして該当ユーザーを取得するメソッドに置き換えてください。することでコントローラーに到達するころにはrequestの中にcurrentUserが含まれるようになります。リクエストの型を拡張この際に、requestの型を拡張して、currentUserも含むようにしておくと便利です。};ミドルウェアを反映この作成したミドルウェアはapp.module.tsに入れることで反映させることができます。}}上記の場合は、ミドルウェアをすべてのパスに適応しています。そもそもcurrentUserを使わないパスにつけてしまうと無駄な処理が走ってしまいますが、とりあえず全部に適応しても良いと思います。僕の場合は、次に説明するガード(currentUserがない場合にエラーにする)の対象とするパスを選択できるようにすることで対応する形にしました。ガード(guard)を作る次にガードです。requestの中にcurrentUserが入っているだけでは不便です。currentUserがない場合は、x-api-keyがない、または、不正ということでコントローラーに到達する前にエラーにしてしまいましょう。ガードを定義ガードはミドルウェアのあとに処理されます。このタイミングでcurrentUserがない場合をエラーにすることで適切にリクエストを処理できます。}}ガードを反映ガードを反映させる方法はいくつかあります。main.tsでグローバルに反映させる方法もありますし、デコレーターでコントローラーのクラスやそのメソッドに適用させることもできます。}}これでもいいのですが、こうすると付与すべきデコレーターが無限に増えて大変なので、カスタムデコレーターを使って少しでも楽になるようにしました。デコレーターを作る少し楽をするためにカスタムデコレーターを作りました。使い方に慣れてくると色々工夫できるので面白くなってきます(ようやくちょっとわかった気がしている)。デコレーターを定義このような形でデコレーターを定義することができます。applyDecorators(...userDecorators);}ApiSecurity("X-Api-Key")はここで新たに追加していますが、これはOpenAPI(Swagger)の自動生成を使っている人には便利です。2つデコレーターを付ける代わりに@GuardCurrentUserをつけるだけで良くなります。currentUserにまつわるデコレーターを変更したくなっても付けた箇所をすべてもれなく変更するのではなくこのカスタムデコレーター1つだけで良くなるのでその意味でもかなり便利です。UIにてheaderが設定できるようになります。UIにてheaderが設定できるこうすることでリクエストを叩いてみるのもかなり楽になります。デコレーターを反映あとは作ったカスタムデコレーターを反映させていきます。方法は先程と同様ですが、コントローラーのクラス単位につけていくと楽だと思います。一つデコレーターを作成ここまでで既にコントローラー内でcurrentUserを取得エラーの場合は即レスポンスすることができます。コントローラー内でcurrentUserを取得するのが少しまだ不便なのでもうひと工夫だけしました。現状だとこんな感じだと思います。}}わざわざ、requestを取得してその中のcurrentUserを引っ張ってくる必要があります。currentUserを引っ張ってこれるデコレーターも作りました。currentUser用のデコレーターとてもシンプルです。}}と取得することができるようになります。見栄えが良くなりました。このような方法は公式に紹介されています。した一工夫もドキュメントに紹介されているので読み込むと色んな発見がありました。まとめ上記のようにすると、なんとかcurrentUserを各所で使い回せるようになりました。各箇所にデコレーター付けて回るのも結構大変なので、共通処理はできる限り、ミドルウェアガードデコレーターに逃がしてやるといい感じにNestJSは使いこなせていくのかなという気持ちになりました。19:00NestJSでmiddlewareとguardとdecoratorを活用してcurrentUserを実装した話。»スポンサードリンクプロフィールたわです。東京から福岡移住したWeb開発の人が発信していくブログです!Twitter(たわ)note(たわ)Instagram(あすか)YouTube(あすか)関連記事2020-01-30NestJSでのモジュール分割。相互依存がつらいので細かく分けた話。流行2020-02-07【2020年】エンジニアフレンドリーシティ福岡フェスティバルに行って来た話。内輪感減ると良さそう。(2)月別アーカイブ検索スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。