Nestjs::nomad::2.0~

YP J·2023년 2월 8일
0

Nestjs

목록 보기
2/6

니꼬형 NestJS REST API 강의

  • terminal에 nest를 입력하면 우리가 사용할수있는 nest-cli 명령어가 나온다.

  • terminal 에 nest g(generator) co(controller)

  • 치면 controller 이름을 물어보면 적으면 (ex. movies)

  • 자동으로 import 해주고 파일도 생성해주고 test 파일인 spec.~ 도 생성해준다.

  • 자동으로 생성된 파일인 movies.controller.ts

import { Controller } from '@nestjs/common';

@Controller('movies')
export class MoviesController {
    @Get()
    getAll(){
        return 'this is TEst '
    }
}
  • 이렇게 getAll함수 만들고 띄어 보면
  • 보려고 했는데 @Get부분에서 에러가 계속 났다 Cannot find Get ~
  • 그래서 옆에 파란색 뭐 뜨길래 update눌렀더니
import { Controller, Get } from '@nestjs/common';

@Controller('movies')
export class MoviesController {
    @Get()
    getAll(){
        return 'this is TEst ';
    }
}
  • 첫번째 줄에 Controller 옆에 Get이 추가 되었다.

  • 그래서

@Controller('movies')
export class MoviesController {
    @Get()
    getAll(){
        return 'this is TEst ';
    }

    @Get("/:id")
    getOne() {
        return `This will return oen movie`
    }

}

  • ...movies/1 부분에서 1 을 가져오고 싶다.
import { Controller, Get, Param } from '@nestjs/common';
import { sequenceEqual } from 'rxjs';

@Controller('movies')
export class MoviesController {
    @Get()
    getAll(){
        return 'this is TEst ';
    }

    @Get("/:id")
    getOne(@Param("id") movieId: string) {
        return `This will return oen movie ${movieId}`
    }

}
  • 이제 Post, Delete
@Controller('movies')
export class MoviesController {
    @Get()
    getAll(){
        return 'this is TEst ';
    }

    @Get("/:id")
    getOne(@Param("id") movieId: string) {
        return `This will return oen movie ${movieId}`
    }

    @Post()
    create() {
        return "This will create a movie"
    }

    @Delete("/:id")
    remove(@Param("id") movieId: string) {
        return `This will delete movie : ${movieId}`
    }

}

  • Put 은 모든 리소스를 업데이트하고
  • Patch 는 리소스의 일부분만 업데이트 해준다.

2.1 More Routes

  • Post 에서 Body부분 가져오기
    @Post()
    create(@Body() movieData) {
        // console.log(movieData)
        // return "This will create a movie"
        return movieData
    }
  • 하고 insomnia 에서 Post 하고 body 부분에서 json 형식으로 데이터 작성해주면
{
	"name": "Tenet",
	"director": "Jpark"
}
  • console.loge로 찍어보면 이렇게 뜨고
    { name: 'Tenet', director: 'Jpark' }
  • return movieData하면 json 형식으로 그대로 페이지에 뜬다.

  • patch 에도 파람을 받아서 json 을 업데이트 해보자
    @Patch("/:id")
    patch(@Param("id") movieId: string, @Body() updateData) {
        return {
            updateMovie:movieId,
            ...updateData
        }
    }

-홈페이지에 뜨는 화면

{
	"updateMovie": "sdlkdjf",
	"name": "Tenet",
	"director": "Jpark"
}

  • serach
    @Get("search")
    search() {
        return `We are searching for a movie with a title :`
    }
    @Get("/:id")
    getOne(@Param("id") movieId: string) {
        return `This will return oen movie ${movieId}`
    }
  • NestJS는 search 부분이 get보다 밑에 있으면 search 를 id로 판단한다.
  • 즉 .../movies/search 하면
  • @Get(:id) 에서 search로 납치해 간다. 그래서 search를 위로 ~
@Get("search")
    search(@Query("year") searchingYear:string) {
        return `We are searching for a movie with a Fuckin year: ${searchingYear}`
    }

2.2

  • 아까는 controller 이제는 Service 를 만들어보자 (함수의 메인 로직)

  • 터미널에 아까와 같이 nest g s(service)

  • 그리고 movies.service.ts 파일에서 가짜 데이터베이스를 다뤄볼거다.

  • 그전에 movies 폴더에 가짜 데이터 베이스 역학을 할 (Wrong ! model 을 만드는것.)

  • entities라는 폴더 만들고 그 안에 movies.entity.ts파일 만든다.

  • 보통은 entities에 실제로 데이터 베이스의 모델을 만들어야 한다.

getOne(id: string): Movie {
    return this.movies.find(movie => movie.id === parseInt(id))
}
  • 여기서 ParseInt(id) 는 +id 로 해도 똑같이 작동한다 (string -> int 로 바꾸기)

  • But Controller에서 Service에 접근하는 법

    @Get()
    getAll() :Movie[] {
        return this.movieService.getAll()
    }
  • 로직 부분은 services
    getOne(id: string): Movie {
        const movie = this.movies.find(movie => movie.id === parseInt(id))
        if (!movie) {
            throw new NotFoundException(`Movie with ID: ${id} not fuckin found`)
        }
        return movie;
    }

    deleteOne(id:string){
        this.getOne(id);
        this.movies = this.movies.filter(movie => movie.id !== +id);
        // return true;
    }

    create(movieData) {
        this.movies.push({
            id: this.movies.length + 1,
            ...movieData
        })
    }
    update(id:string, updateData) {
        const movie = this.getOne(id)
        this.deleteOne(id)
        this.movies.push({ ...movie, ...updateData })        
    }
  • 컨트롤러에서 이 로직과 연결
    @Post()
    create(@Body() movieData) {
        // console.log(movieData)
        // return "This will create a movie"
        // return movieData
        return this.movieService.create(movieData);
    }

    @Delete("/:id")
    remove(@Param("id") movieId: string) {
        // return `This will delete movie : ${movieId}`
        return this.movieService.deleteOne(movieId)
    }

    @Patch(":id")
    patch(@Param("id") movieId: string, @Body() updateData) {
    //     return {
    //         updateMovie:movieId,
    //         ...updateData
    //     }
        return this.movieService.update(movieId, updateData)
    }

이제 updateData Create할때 유효성 검사를 해보자

{
	"hacked" : "by me" 
}
  • 같은게 들어올수도 있으닌까

  • 유효성 감사하기 위해선 updateData, movieData 한테 타입을 부여한다.

  • 그러기 위해선 DTO(Data Transfer Object) 가 필요하다

profile
be pro

0개의 댓글