45.1K Views
April 01, 23
スライド概要
NestJS を使い始めて1年くらい経った tottoruby #47 @watti
watti / ogawatti 2
NestJS 3
NestJSとは TypeScript製のバックエンドフレームワーク Node.js上で動く nest cli で簡単にソースファイルのテンプレートを生成できる テストフレームワークが用意されている TypeORMで型の恩恵を最大限に受けつつDB操作できる https://qiita.com/elipmoc101/items/9b1e6b3efa62f3c2a166#nestjsとは 4
Create NestJS App 5
Generate Resource 6
Request to Tasks API 7
Generated codes 8
generateしただけだと ほぼ何もないコードになってしまうので 少しだけ実装したものを軽く紹介 9
tasks.controller.ts Routing Request / Response 10
dto/create-task.dto.ts Request Bodyを定義 このサンプルだとValidationも実行 11
tasks.service.ts Entity操作等を行う 12
entities/task.entity ORMapper 13
Module 14
Module ImportでModuleを組み込む (階層構造) Module内でEntityを利用できる ようにする ProviderでControllerから Serviceを利用できるようにする Exportで他のModuleでService を利用できるようにする https://docs.nestjs.com/modules 15
app.module.ts 16
tasks.module.ts 17
Middlewares Middleware / Guards / Interceptors / Pipes / Exception Filters (まとめた良い言い方がない...) 18
https://zenn.dev/morinokami/articles/nestjs-overview 19
logger.middlewre.ts RequestやResponseに何かしらできる (Resource単位) https://docs.nestjs.com/middleware 20
auth.guard.ts リクエストを検証し、パスする / 403を返す https://docs.nestjs.com/guards#authorization-guard 21
logging.interceptor.ts RequestやResponseに何かしらできる (API単位) https://docs.nestjs.com/interceptors#aspect-interception 22
Pipes データの変換やバリデーションを行う 組み込みのPipeもある ValidationPipe ParseIntPipe DefaultValuePipe ... https://docs.nestjs.com/pipes#binding-pipes 23
Exception filters https://docs.nestjs.com/pipes#binding-pipes 24
ざっくりまとめると Middlewares Role Middleware Req/Resに何か Guards 権限確認等 Interceptors ロジック追加 Pipe 変換、検証等 Exception filters 例外処理 https://zenn.dev/morinokami/articles/nestjs-overview 25
Custom Decorators 26
user.decorator.ts https://docs.nestjs.com/custom-decorators 27
TECNIQUES Configuration, Database, Mongo, Validation, Caching, Serialization, Versioning, Task scheduling, Queue, Logging, Cookies, Events, Compression, File upload, Streaming files, HTTP module, Session, Model-View-Controller, Performance (Fastify), Server-Sent Events https://docs.nestjs.com/ たくさんありますが時間の関係上2つだけ 28
DATABASE 29
TypeORM synchronize オプション使った時のローカルでの開発体験 Entityに変更加えるだけで自動でMigrationが走る 便利すぎてMigrationファイル生成するの忘れる ( 本番だけマイグレーション自力でするのどうよ問題 SQLを最低読む必要がある でも自動生成するし... 本番環境では非推奨だけどローカルでは使いたい 公式推しとはいえPrismaもレシピがあるのでお好みで良さそう 30
OPENAPI 31
OpenAPI デフォルト localhost:3000/api でSwagger UIが立ち上がる 対象のAPIに @ApiTags() を打っていく Controller, DTO, EntityにDecoratorで定義を追加していく https://docs.nestjs.com/openapi/introduction 32
DecoratorでのAPI仕様定義 33
SwaggerUI起動とopenapi.yamlの吐き出し 34
35
backend-client(ts) の生成 Frontend(Next.js)に取り込んで利用している FE/BE両方やってると、とても良い 36
実際どんな感じで使っているか 37
tasks.controller.ts Interceptorで事前に検索してRequestに載せておく Decorator経由でControllerで受け取る 38
使ってみている機能とか Middlewareでログ記録 Guardsでアクセス制限 (権限チェック) DTOでValidation (Pipe) Serviceは利用を最低限にする TypeORMをActiveRecord Patternで シンプルに使う Serviceは複雑な処理がある場合だけ 39
困ったこと Middleware / Interceptorsの使い分け どちらでも同じことができる 名前に役割があるわけでもない 処理順があるのでそこには縛られる 実際は対象範囲が異なる (名前...) 40
良いなと思っているところ GraphQLもWebSccketもWorkerもetcも 色々サポートしてくれてる ドキュメントもかなり豊富 公式のサンプルのテストコードは イマイチだったけど 実装を書くだけなら結構早い 41
辛いなと思っているところ テスト(Jestとも言える) 並列化の辛さ 宣言の場所・重複 リソースごとに階層を切るところ そこに乗っかると辛くなっていくので 掘ることになるが、何がどこ、に迷う インポートが面倒 旨みは承知 一方、単一のリソースにしかアクセス しないとかない訳で 42
vs Ruby on Rails 型の恩恵はものすごく感じる、一方邪魔にも感じる RSpecが強すぎる なるべくE2E側になるべく倒した方が良いと思ってる ActiveRecordが強すぎる (NestJSの範囲ではないけど) 名前変更のコストは低いが、型変更のコストは高い デコレータだらけになるのは、それで良いのか感がある (書いておいて...) Railsと単純比較は難しい 43
個人的な結論(感想) TSでやりたければらこれでええんちゃう感はある (ガッツリ使い始める前と変わらぬ感想) (言語的なところもあり) 書いていて楽しい感はあんまりないけど 型に助けられるところはままある Next.jsと行ったり来たりするならNestJSの方が頭は圧倒的に楽 44
おわり 45