NestJSを使い始めて1年くらい経った

44.6K Views

April 01, 23

スライド概要

profile-image

主にWeb特にBackendを主としています。 最近はアジャイル開発の伴走支援をしています。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

NestJS を使い始めて1年くらい経った tottoruby #47 @watti

2.

watti / ogawatti 2

3.

NestJS 3

4.

NestJSとは TypeScript製のバックエンドフレームワーク Node.js上で動く nest cli で簡単にソースファイルのテンプレートを生成できる テストフレームワークが用意されている TypeORMで型の恩恵を最大限に受けつつDB操作できる https://qiita.com/elipmoc101/items/9b1e6b3efa62f3c2a166#nestjsとは 4

5.

Create NestJS App 5

6.

Generate Resource 6

7.

Request to Tasks API 7

8.

Generated codes 8

9.

generateしただけだと ほぼ何もないコードになってしまうので 少しだけ実装したものを軽く紹介 9

10.

tasks.controller.ts Routing Request / Response 10

11.

dto/create-task.dto.ts Request Bodyを定義 このサンプルだとValidationも実行 11

12.

tasks.service.ts Entity操作等を行う 12

13.

entities/task.entity ORMapper 13

14.

Module 14

15.

Module ImportでModuleを組み込む (階層構造) Module内でEntityを利用できる ようにする ProviderでControllerから Serviceを利用できるようにする Exportで他のModuleでService を利用できるようにする https://docs.nestjs.com/modules 15

16.

app.module.ts 16

17.

tasks.module.ts 17

18.

Middlewares Middleware / Guards / Interceptors / Pipes / Exception Filters (まとめた良い言い方がない...) 18

19.

https://zenn.dev/morinokami/articles/nestjs-overview 19

20.

logger.middlewre.ts RequestやResponseに何かしらできる (Resource単位) https://docs.nestjs.com/middleware 20

21.

auth.guard.ts リクエストを検証し、パスする / 403を返す https://docs.nestjs.com/guards#authorization-guard 21

22.

logging.interceptor.ts RequestやResponseに何かしらできる (API単位) https://docs.nestjs.com/interceptors#aspect-interception 22

23.

Pipes データの変換やバリデーションを行う 組み込みのPipeもある ValidationPipe ParseIntPipe DefaultValuePipe ... https://docs.nestjs.com/pipes#binding-pipes 23

24.

Exception filters https://docs.nestjs.com/pipes#binding-pipes 24

25.

ざっくりまとめると Middlewares Role Middleware Req/Resに何か Guards 権限確認等 Interceptors ロジック追加 Pipe 変換、検証等 Exception filters 例外処理 https://zenn.dev/morinokami/articles/nestjs-overview 25

26.

Custom Decorators 26

27.

user.decorator.ts https://docs.nestjs.com/custom-decorators 27

28.

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

29.

DATABASE 29

30.

TypeORM synchronize オプション使った時のローカルでの開発体験 Entityに変更加えるだけで自動でMigrationが走る 便利すぎてMigrationファイル生成するの忘れる ( 本番だけマイグレーション自力でするのどうよ問題 SQLを最低読む必要がある でも自動生成するし... 本番環境では非推奨だけどローカルでは使いたい 公式推しとはいえPrismaもレシピがあるのでお好みで良さそう 30

31.

OPENAPI 31

32.

OpenAPI デフォルト localhost:3000/api でSwagger UIが立ち上がる 対象のAPIに @ApiTags() を打っていく Controller, DTO, EntityにDecoratorで定義を追加していく https://docs.nestjs.com/openapi/introduction 32

33.

DecoratorでのAPI仕様定義 33

34.

SwaggerUI起動とopenapi.yamlの吐き出し 34

36.

backend-client(ts) の生成 Frontend(Next.js)に取り込んで利用している FE/BE両方やってると、とても良い 36

37.

実際どんな感じで使っているか 37

38.

tasks.controller.ts Interceptorで事前に検索してRequestに載せておく Decorator経由でControllerで受け取る 38

39.

使ってみている機能とか Middlewareでログ記録 Guardsでアクセス制限 (権限チェック) DTOでValidation (Pipe) Serviceは利用を最低限にする TypeORMをActiveRecord Patternで シンプルに使う Serviceは複雑な処理がある場合だけ 39

40.

困ったこと Middleware / Interceptorsの使い分け どちらでも同じことができる 名前に役割があるわけでもない 処理順があるのでそこには縛られる 実際は対象範囲が異なる (名前...) 40

41.

良いなと思っているところ GraphQLもWebSccketもWorkerもetcも 色々サポートしてくれてる ドキュメントもかなり豊富 公式のサンプルのテストコードは イマイチだったけど 実装を書くだけなら結構早い 41

42.

辛いなと思っているところ テスト(Jestとも言える) 並列化の辛さ 宣言の場所・重複 リソースごとに階層を切るところ そこに乗っかると辛くなっていくので 掘ることになるが、何がどこ、に迷う インポートが面倒 旨みは承知 一方、単一のリソースにしかアクセス しないとかない訳で 42

43.

vs Ruby on Rails 型の恩恵はものすごく感じる、一方邪魔にも感じる RSpecが強すぎる なるべくE2E側になるべく倒した方が良いと思ってる ActiveRecordが強すぎる (NestJSの範囲ではないけど) 名前変更のコストは低いが、型変更のコストは高い デコレータだらけになるのは、それで良いのか感がある (書いておいて...) Railsと単純比較は難しい 43

44.

個人的な結論(感想) TSでやりたければらこれでええんちゃう感はある (ガッツリ使い始める前と変わらぬ感想) (言語的なところもあり) 書いていて楽しい感はあんまりないけど 型に助けられるところはままある Next.jsと行ったり来たりするならNestJSの方が頭は圧倒的に楽 44

45.

おわり 45