Closed15

NestJSについて雑多に情報をまとめていく

catnosecatnose

の前にドキュメントを読む。

https://docs.nestjs.com/

NestJS CLIをグローバルインストールして($ npm i -g @nestjs/cli)プロジェクトを作成する

$ nest new project-name
catnosecatnose

nest newで作られたファイルを眺めてみる

eslintやprettierの設定ファイルまで作ってくれるんだなー

  • app.controller.ts:ルートごとのコントローラー
  • app.controller.spec.ts:コントローラーのテスト
  • app.module.ts:モジュール(見ていく)
  • app.service.ts:メソッドごとのサービス(見ていく)
  • main.ts:エントリとなるファイル。NestFactoryでアプリケーションのインスタンスを作るとのこと
catnosecatnose

Nest.jsはプラットフォームに依存しないフレームワーク。どのNode HTTP フレームワークでも動く。ExpressとFastifyのアダプターが用意されている。

catnosecatnose

とりあえず動かしてみる。

$ yarn start:dev
# =>  listen EADDRINUSE: address already in use :::3000

ポート番号の3000は別で使いたいのでてきとうに変更する

main.ts
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(8002);
}

http://localhost:8002 にアクセスしたら無事に「Hello World!」が表示された

catnosecatnose

コントローラーについて

NestJSのControllerのドキュメント

  • コントローラーはリクエストを受け取ってレスポンスを返すもの。
    • ルーティングもコントローラーで行う
    • 1つのコントローラー内で複数のルートを設定できる(userのコントローラーを作ってuserに関するCRUDはそのコントローラーでルーティングするイメージ)

  • 何のコントローラーかはデコレーター(@Controller("foo"))で宣言
  • コントローラー内のアクションもデコレーター(@メソッド())で宣言

サンプルを見てみる。

cats.controller.ts
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というエンドポイントが作られるイメージ

catnosecatnose

レスポンスのシリアライズについて

NestJSではビルトインの仕組みでシリアライズを行ってくれる。JSのオブジェクトをreturnすれば自動でJSONに変換してくれる。ただし、string、boolean、numberといったプリミティブな値を返した場合はシリアライズは行われない。

export class CatsController {
  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }
}

なお、Expressなどのライブラリの形式でレスポンスを返すことも可能

catnosecatnose

レスポンスのHTTPステータス

こんな感じでデコレーターで指定

@Post()
@HttpCode(204)
create() {
  return 'This action adds a new cat';
}
catnosecatnose

レスポンスヘッダーをカスタマイズ

これもデコレーターで

@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';
}
catnosecatnose

URLからパラメーターを受け取りたい場合は以下のようにする

cats.controller.ts
@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というように特定のパラメーターだけ受け取ることもできるとのこと。

プロジェクトごとに規約を決める感じになるのかな?なんとなく前者の方が分かりやすそうだけど

catnosecatnose

非同期処理は普通にasyncつけるだけでできる

@Get()
async findAll(): Promise<any[]> {
  return [];
}
catnosecatnose

リクエストの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)`;
  }
catnosecatnose

コントローラーをmoduleに登録

コントローラーはmoduleファイルで明記しておく必要あり。これをやらないとNestJSはコントローラーを読んでくれない。

app.module.ts
import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';

@Module({
  controllers: [CatsController],
})
export class AppModule {}
このスクラップは2020/12/19にクローズされました