nestjs usage memo

◾️ this memo is from nomadcoders lecture

  1. install nestjs
$ npm i -g @nestjs/cli
$ nest new project-name

2. install test cli tool(insomnia) for restapi / graphql

3. nest command for help

  • nest generate controller – nest g c
  • nest generate service – nest g s

4. Controller sample fro CRUD(post/get/patch or put/delete)

import {
  Controller,
  Post,
  Get,
  Patch,
  Delete,
  Param,
  Body,
  Query,
} from '@nestjs/common';

@Controller('movies')
export class MoviesController {
  @Post()
  create(@Body() movieData) {
    console.log(movieData);
    return { ...movieData };
  }

  @Get()
  getAll() {
    return 'This will return all movies';
  }

  @Get('search')
  search(@Query('year') searchYear: string) {
    return `We search for a movie ${searchYear}`;
  }

  @Get(':id')
  getOne(@Param('id') movieId: string) {
    return `This will return one movie ${movieId}`;
  }

  @Patch(':id')
  patch(@Param('id') movieId: string, @Body() updateData) {
    return {
      updateMovie: movieId,
      ...updateData,
    };
  }

  @Delete(':id')
  remove(@Param('id') movieId: string) {
    return `This will delete the ${movieId} : movie`;
  }
}

5. Service (business logic)

6. dto and input validator (ex- option field : readonly title?: string;)

import { IsString, IsNumber } from 'class-validator';

export class CreateMovieDto {
  @IsString()
  readonly title: string;

  @IsNumber()
  readonly year: number;

  @IsString({ each: true })
  readonly genres: string[];
}
  • install package for validator : npm i class-validator
  • need class-validator annotation of dto when you use whitelist:true option
...
import { ValidationPipe } from '@nestjs/common';
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
    }),
  );
  await app.listen(3000);
}
bootstrap();
....
import { CreateMovieDto } from './dto/create-movie.dto';

@Controller('movies')
export class MoviesController {
  constructor(private readonly moviesService: MoviesService) {}

  @Post()
  create(@Body() movieData: CreateMovieDto) {
    return this.moviesService.create(movieData);
  }
....
import { IsBoolean, IsString, Length } from 'class-validator';
....
{
  @Field((type) => String)
  @IsString()
  @Length(5, 10)
  name: string;

  @Field((type) => Boolean, { nullable: true })
  @IsBoolean()
  isVegan?: boolean;
}
....

7. type transform (ex : input string -> number in controller / service)

  • install package for type transform : npm i class-transformer
....
import { ValidationPipe } from '@nestjs/common';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
      transform: true,
    }),
  );
  await app.listen(3000);
}
bootstrap();
....
@Get(':id')
  getOne(@Param('id') movieId: number): Movie {
    return this.moviesService.getOne(movieId);
  }
....

8. create optional update-dto extends create-dto

  • npm i @nestjs/mapped-types
import { PartialType } from '@nestjs/mapped-types';
import { CreateMovieDto } from './create-movie.dto';

export class UpdateMovieDto extends PartialType(CreateMovieDto) {}

9. usage playground of graphql : query and mutation

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です