NestJS 공식문서의 Controller 개념 공부 4번째 포스트로, Controller의 Redirection, Route parameters 주제로 작성한다.
특정 URL로 응답을 리다이렉션하려면, @Redirect()
데코레이터를 사용하는 방법이나 라이브러리-특정 응답 객체를 사용해 res.redirect()
를 직접 호출하는 방법을 사용할 수 있다.
@Redirect()
는 url
, statusCode
두 개의 아규먼트를 받는다. 두 아규먼트 모두 선택적(optional)이다. statusCode
의 디폴트 값은 302
이다.
@Get()
@Redirect('https://nestjs.com', 301)
HTTP 상태 코드 또는 리다이렉트 URL을 동적으로 결정하고 싶은 경우, 아래와 같은 형태의 객체를 라우트 핸들러 메서드가 반환하게 하면 된다.
{
"url": string,
"statusCode": number
}
반환 값은 @Redirect()
데코레이터에 전달되는 아규먼트를 덮어쓰게 된다. 예를 들어 아래와 같다.
@Get('docs')
@Redirect('https://docs.nestjs.com', 302)
getDocs(@Query('version') version) {
if (version && version === '5') {
return { url: 'https://docs.nestjs.com/v5/' };
}
}
요청의 일부에 동적 데이터를 사용해야 하는 경우, 정적 경로를 갖는 라우트는 동작하지 않는다. 예를 들어, id 1
을 갖는 고양이를 가져오기 위한 GET /cats/1
가 있다. 파라미터를 갖는 라우트를 정의하려면, 동적으로 변경되는 요청 URL 경로에서 동적 값을 캡쳐할 수 있도록 라우트의 경로에 라우트 파라미터 토큰을 추가할 수 있다.
아래 예제에서 @Get()
데코레이터 내부에서 라우트 파라미터 토큰을 사용한다. 이 방식으로 선언된 라우트 파라미터는 @Param()
데코레이터를 사용해 접근할 수 있다. @Param()
데코레이터는 메서드 정의에 추가되어야 한다.
파라미터를 갖는 라우트는 모든 정적 경로 다음에 선언되어야 한다. 그래야 파라미터를 갖는 경로가 정적 경로로 향하는 트래픽을 가로채는 것을 방지할 수 있다.
@Get(':id')
findOne(@Param() params): string {
console.log(params.id);
return `This action returns a #${param.id} cat`;
}
@Param()
데코레이터는 메서드 파라미터를 데코레이팅하기 위해 사용된다. 이 데코레이터는 라우트 파라미터를 데코레이트된 메서드 파라미터의 프로퍼티로 메서드 내부에서 사용할 수 있게 해준다.
위 코드를 보면, params.id
로 id
파라미터에 접근할 수 있다. @Param
데코레이터에 특정 파라미터 토큰을 전달할 수도 있다. 그러면 아래 예제와 같이 메서드 내부에서 토큰을 사용해 직접 라우트 파라미터를 참조할 수 있다.
@Get(':id')
findOne(@Param('id') id: string): string {
return `This action returns a #${id} cat`;
}