니꼬형 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 '
}
}
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`
}
}
https://www.gitmemory.com/issue/Kong/insomnia/1986/607221062
"I had this with an Nginx server, I found that adding ssl_protocols TLSv1.2 to the vhost config made it work. Previously I only had ssl_protocols TLSv1.3, I'm guessing that Insomnia doesn't support TLSv1.3."
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}`
}
}
@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}`
}
}
@Post()
create(@Body() movieData) {
// console.log(movieData)
// return "This will create a movie"
return movieData
}
{
"name": "Tenet",
"director": "Jpark"
}
{ name: 'Tenet', director: 'Jpark' }
@Patch("/:id")
patch(@Param("id") movieId: string, @Body() updateData) {
return {
updateMovie:movieId,
...updateData
}
}
-홈페이지에 뜨는 화면
{
"updateMovie": "sdlkdjf",
"name": "Tenet",
"director": "Jpark"
}
...updateDate
는 뭐지? // 데이터의 오브젝트를 리턴 한다는 의미? 스프레드 문법 이다.
https://learnjs.vlpt.us/useful/07-spread-and-rest.html
@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}`
}
@Get("search")
search(@Query("year") searchingYear:string) {
return `We are searching for a movie with a Fuckin year: ${searchingYear}`
}
아까는 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()
}
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) 가 필요하다