Nestjs概要
- 疎結合で管理され、決まったアーキテクチャで構成されるフレームワーク
- 複数で開発する時管理がしやすい
インストール
- nestコマンドを使えるようにグローバルにインストール
npm i -g @nestjs/cli
-
nest
コマンドを使ってプロジェクトを作成
nest new nestjs-practice
起動
- 単純なサーバーの起動
npm run start
- ファイルの監視付きサーバー起動
npm run start:dev
コントローラー(controller)
- ルーティングをしてくれる役割
- パス・メソッドを設定できる
-
controller
ファイルで記述される
import { Controller, Get } from '@nestjs/common';
@Controller('cats')
export class CatsController {
//メソッド
@Get()
findAll(): string {
return 'This action returns all cats';
}
}
- ファイルの自動生成
nest g controller <ファイル名>
@Controller('cats')
export class CatsController {
@Get()
findAll(@Req() request: Request): string {
return 'This action returns all cats';
}
}
プロバイダー(provider)
- より複雑な処理を定義する場所
- 依存関係の挿入が可能
-
service
ファイルで記述される -
@Injectable()
デコレータを使用
import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';
@Injectable()
export class CatsService {
private readonly cats: Cat[] = [];
create(cat: Cat) {
this.cats.push(cat);
}
findAll(): Cat[] {
return this.cats;
}
}
- サービスファイルに記述された関数を使うのは
controller
ファイル(下記はcontroller
に記述) - コンストラクターに型として記述するとそれ以降で使用可能
import { Controller, Get, Post, Body } from '@nestjs/common';
import { CreateCatDto } from './dto/create-cat.dto';
import { CatsService } from './cats.service';
//型定義ファイル
import { Cat } from './interfaces/cat.interface';
@Controller('cats')
export class CatsController {
//依存関係を挿入
constructor(private catsService: CatsService) {}
@Post()
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
@Get()
async findAll(): Promise<Cat[]> {
return this.catsService.findAll();
}
}
モジュール(module)
- アプリケーション構造を整理するためのもの
-
module
ファイルで記述する - モジュール同士は自動で関連付けされる
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Module({
controllers: [CatsController],
providers: [CatsService],
})
export class CatsModule {}
リゾルバー(resolver)
-
QraphQL
で使うことができる。 -
@Query
や@Mutation
といったデコレータを使うことで、参照や更新処理を受け付ける。 - serviceファイルを読み込んで使う。
@Resolver(() => User)
export class UsersResolver {
constructor(private readonly userService: UsersService) {}
@Query(() => User)
user(@Args() args: FindFirstUserArgs) {
return this.userService.findFirst(args)
}
@Mutation(() => User)
async createUser(@Args() args: CreateOneUserArgs) {
args.data.password = await bcrypt.hash(args.data.password, 10)
return this.userService.createUser(args)
}
}