-
20221222Thu_공부 일지> Backend/NestJS 2022. 12. 23. 02:21
< 복습>
1. Controller: 들어오는 요청을 받고, 처리된 결과를 응답으로 돌려주는 인터페이스 역할을 한다.
< 공부 내용>
2. Header:
=> @Header decorator를 사용하여 커스텀 헤더 추가할 수 있다.
//커스텀 Header: @Header데커레이터를 사용 (혹은, res.header()로 직접 설정 가능) @Header('key', "value") @Get('header/:id') findOne_Header(@Param('id') id: string) { if(+id < 1){ //문자로 받은 id앞에 +붙여주면, 숫자로 변환 throw new BadRequestException('id값은 0보다 큰 값이어야 합니다.') } return this.usersService.findOne(+id); }
3. Redirection:
=> 종종 서버가 요청을 처리한 후, 요청을 보낸 클라이언트를 다른 페이지로 이동하고 싶을 경우, redirection 사용.
=> @Redirection decorator의 첫번째 인수는 이동한 URL, 두번째 인수는 status를 의미(사용된 300번대 status는 이동됨을 의미)
@Get('redirect/:id') @Redirect('https://nestjs.com', 301) findOne_Redirect(@Param('id') id: string) { if(+id < 1){ //문자로 받은 id앞에 +붙여주면, 숫자로 변환 throw new BadRequestException('id값은 0보다 큰 값이어야 합니다.') } return this.usersService.findOne(+id); } // Query 매개변수로, 버전 숫자를 전달받아 해당 버전의 페이지로 이동시, @Get('redirect/docs') // @Redirect('https://docs.nestjs.com', 302) example_Redirect(@Query('version') version) { if(version && +version === 5) // version이 있고, 그 version이 5인 경우에만 이동. return { url: 'http://docs.nestjs.com/v5/' } }
4. Routing Param: 라우팅 매개변수 === 패스 매개변수
=> 경로를 구성하는 매개변수.
// Routing: @Get(':userId/memo/:memoId') getUserMemo( @Param('userId') userId: string, @Param('memoId') memoId: string ) { return `userId : ${userId}, memoId : ${memoId}` }
5. 하위 도메인 라우팅
=> 서버에서 제공하는 기능을 API로 외부에 공개한 경우, 들어온 요청을 서로 다르게 처리하고 싶을 경우 + 하위 도메인에서 처리하지 못하는 요청은 원래 도메인에서 처리되도록 할 때, 사용
순서:
1) nest g controller Api
2) 등록 (app.module.ts)
@Module({ imports: [UsersModule], controllers: [ApiController, AppController], providers: [AppService], }) export class AppModule {}
3) 작성 (1번째는 기본, 2번째는 서브 도메인을 변수로 받아서 사용, 이때 /etc/hosts 파일에 추가 필요 => 헤맨내용(4) 참조)
=> 사용할때 마다, Controller 위아래로 바꿔줄 것
import { Controller, Get, HostParam } from '@nestjs/common'; @Controller({ host: 'api.localhost' }) // @Controller({ host: ':version.api.localhost' }) export class ApiController { @Get() example1(): string { return 'Hello, API' } // curl http://v1.api.localhost:3000 // Hello, API% @Get() example2(@HostParam('version') version: string): string { return `Hello, ${version}`; } // curl http://v1.api.localhost:3000 // Hello, v1% }
import { Controller, Get, HostParam } from '@nestjs/common'; @Controller({ host: 'api.localhost' }) // @Controller({ host: ':version.api.localhost' }) export class ApiController { @Get() example1(): string { return 'Hello, API' } // curl http://v1.api.localhost:3000 // Hello, API% @Get() example2(@HostParam('version') version: string): string { return `Hello, ${version}`; } // curl http://v1.api.localhost:3000 // Hello, v1% }
import { Controller, Get, HostParam } from '@nestjs/common'; @Controller({ host: 'api.localhost' }) // @Controller({ host: ':version.api.localhost' }) export class ApiController { @Get() example1(): string { return 'Hello, API' } // curl http://v1.api.localhost:3000 // Hello, API% @Get() example2(@HostParam('version') version: string): string { return `Hello, ${version}`; } // curl http://v1.api.localhost:3000 // Hello, v1% }
=> 해당 내용에 관해서는 헤맨 내용(4) 참조.
6. payload 다루기:
=> 대부분 요청은 처리가 필요한 데이터(payload)를 담아서 보냄. @Param으로 처리할 수 있지만, DTO에 담아서 처리할 수 있음.
1) 기생성된 create.user.dto에 세부 내용 작성
// NestJS에서 payload 를 처리하기 위해서는 데이터 전송 객체 (DTO)를 구현하면 된다. export class CreateUserDto { name: string email: string }
2) 작성
@Post('') create(@Body() createUserDto: CreateUserDto) { // return this.usersService.create(createUserDto); return `유저를 생성했습니다. ${JSON.stringify(createUserDto)}` } // 결과 예시 curl 로 구현 // curl -X POST http://localhost:3000/users -H "Content-Type: application/json" -d '{"name":"example name", "email":"example@gmail.com"}' // 유저를 생성했습니다. {"name":"example name","email":"example@gmail.com"}%
<헤맨 내용>
3. 터미널에서 그냥 curl 명령어를 실행하면, api 를 편하게 확인할 수 있다. => curl http://v1.api.localhost:3000 Hello, v1% 4. MacOS 로컬에서 테스트를 하기 위해 하위 도메인을 api.localhost 로 지정하면 curl 명령어가 제대로 동작 안됨 이는 api.localhost가 로컬 요청을 받을 수 있도록 설정되어 있지 않기 때문입니다. 이를 해결하기 위해 /etc/hosts 파일의 마지막에 127.0.0.1 api.localhost을 추가하고 서버를 다시 구동 /private/etc/hosts에 127.0.0.1 api.localhost 127.0.0.1 v1.api.localhost 삽입 (vim사용) => 구동방법: https://blog.stories.pe.kr/530 => hosts 파일은 도메인의 IP를 찾을 때 컴퓨터가 맨 처음 조사하는 파일이다(그러니깐 DNS 파일인 것이다).
<GIT>
https://github.com/HeathChang/personal_work/commits?author=HeathChang&since=2022-12-23&until=2022-12-23
'> Backend > NestJS' 카테고리의 다른 글
221228수_공부일지 (0) 2022.12.29 20221227화_공부 일지 (0) 2022.12.28 20221221Wed_공부 일지 (0) 2022.12.22 009_TypeORM을 NestJS에 연결 - 1 (0) 2022.05.27 007_NestJS_Service 와 Repository (0) 2022.05.18