NestJSについて雑多に情報をまとめていく
NestJSについて調べてみる。とりあえずAwesome Nestのリポジトリで紹介されている記事を上から順番に目を通していく。
の前にドキュメントを読む。
NestJS CLIをグローバルインストールして($ npm i -g @nestjs/cli
)プロジェクトを作成する
$ nest new project-name
nest new
で作られたファイルを眺めてみる
eslintやprettierの設定ファイルまで作ってくれるんだなー
-
app.controller.ts
:ルートごとのコントローラー -
app.controller.spec.ts
:コントローラーのテスト -
app.module.ts
:モジュール(見ていく) -
app.service.ts
:メソッドごとのサービス(見ていく) -
main.ts
:エントリとなるファイル。NestFactory
でアプリケーションのインスタンスを作るとのこと
Nest.jsはプラットフォームに依存しないフレームワーク。どのNode HTTP フレームワークでも動く。ExpressとFastifyのアダプターが用意されている。
とりあえず動かしてみる。
$ yarn start:dev
# => listen EADDRINUSE: address already in use :::3000
ポート番号の3000は別で使いたいのでてきとうに変更する
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(8002);
}
http://localhost:8002
にアクセスしたら無事に「Hello World!」が表示された
コントローラーについて
- コントローラーはリクエストを受け取ってレスポンスを返すもの。
- ルーティングもコントローラーで行う
- 1つのコントローラー内で複数のルートを設定できる(userのコントローラーを作ってuserに関するCRUDはそのコントローラーでルーティングするイメージ)
- 何のコントローラーかはデコレーター(
@Controller("foo")
)で宣言 - コントローラー内のアクションもデコレーター(
@メソッド()
)で宣言
サンプルを見てみる。
import { Controller, Get } from '@nestjs/common';
@Controller('cats') // この部分はURLに含まれる
export class CatsController {
@Get()
findAll(): string { // メソッド名は自由に決められる
return 'This action returns all cats';
}
}
↑ 例えばこの場合は/cats
にアクセスするとcatsの一覧。もし@post("/bar")
とするとPOST /cats/bar
というエンドポイントが作られるイメージ
レスポンスのシリアライズについて
NestJSではビルトインの仕組みでシリアライズを行ってくれる。JSのオブジェクトをreturnすれば自動でJSONに変換してくれる。ただし、string、boolean、numberといったプリミティブな値を返した場合はシリアライズは行われない。
export class CatsController {
@Get()
findAll(): string {
return 'This action returns all cats';
}
}
なお、Expressなどのライブラリの形式でレスポンスを返すことも可能
レスポンスのHTTPステータス
こんな感じでデコレーターで指定
@Post()
@HttpCode(204)
create() {
return 'This action adds a new cat';
}
レスポンスヘッダーをカスタマイズ
これもデコレーターで
@Post()
@Header('Cache-Control', 'none')
create() {
return 'This action adds a new cat';
}
リダイレクトもデコレーターで。わかりやすくて良い。
@Redirect('https://docs.nestjs.com', 302)
@Post()
create() {
return 'This action adds a new cat';
}
URLからパラメーターを受け取りたい場合は以下のようにする
@Get(':id') // 受け取るパラメーター
findOne(@Param() params): string {
console.log(params.id);
return `This action returns a #${params.id} cat`;
}
この例だとGET /cats/:id
というエンドポイントになる。@Param()
を使うことでパラメーターの値が受け取れる。@Param('id') id: string
というように特定のパラメーターだけ受け取ることもできるとのこと。
プロジェクトごとに規約を決める感じになるのかな?なんとなく前者の方が分かりやすそうだけど
非同期処理は普通にasyncつけるだけでできる
@Get()
async findAll(): Promise<any[]> {
return [];
}
リクエストのbodyを受け取るには@Body()
デコレータを使う
@Put(':id')
update(@Param('id') id: string, @Body() updateCatDto: UpdateCatDto) {
return `This action updates a #${id} cat`;
}
クエリを受け取るには@Query()
デコレータを使う
findAll(@Query() query: ListAllEntities) {
return `This action returns all cats (limit: ${query.limit} items)`;
}
コントローラーをmoduleに登録
コントローラーはmoduleファイルで明記しておく必要あり。これをやらないとNestJSはコントローラーを読んでくれない。
import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';
@Module({
controllers: [CatsController],
})
export class AppModule {}
NestJS、ドキュメントがとても分かりやすい
NestJSをどう実装するかについては、このリポジトリがとても参考になる