인프런 커뮤니티 질문&답변

정민교님의 프로필 이미지
정민교

작성한 질문수

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

AccessTokenGuard 적용해보기

postPosts의 req.user.id 컴파일 에러?

작성

·

219

0

postPosts 컨트롤러까지 요청이 들어왔다면 Request 객체에 user 프로퍼티가 있는 것은 확실한데

타입스크립트 컴파일러가 인식을 못하는 것 같아요.

앱 실행이 안되는데 어떻게 해결해야 할까요...

답변 2

0

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

문제점은 잘 파악하신 것 같습니다.

그렇게 하셔도 문제는 없습니다.

다만 "postPosts 컨트롤러까지 요청이 들어왔다면 Request 객체에 user 프로퍼티가 있는 것은 확실한데

타입스크립트 컴파일러가 인식을 못하는 것 같아요."는 매우 잘못된 표현입니다. Typescript는 빌드타임 툴이기 때문에 런타임 값들을 당연히 인식 못합니다. 이 부분이 이해가 안된다면 제 JS/TS 강의 참고 부탁드립니다!

감사합니다!

정민교님의 프로필 이미지
정민교
질문자

아... user는 동적으로 추가된 프로퍼티니까 Request 타입 정의에 user 프로퍼티가 없는 게 맞고.. 타입스크립트 컴파일러가 정적 타입 검사 할 때 인식 못하는 거 아닌가요...?

컴파일 언어란 소리는 아니고 타입 컴파일러가 그냥 사전에 타입만 체크해주는 거로 알고 있었는데 이것도 틀린건가요?

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

동적으로 추가된 프로퍼티라 Request 타입에 user가 없는게 아니라 실제로 Request 타입에는 user가 없습니다. 그렇기 때문에 Request 타입에 user 타입을 추가하고 싶다면 직접 넣어줘야합니다. (진행하신 방법이 한가지 솔루션이 될 수 있습니다)

TS는 실행과 관계가 없습니다. 빌드타임 타입 체크만 해줍니다.

0

정민교님의 프로필 이미지
정민교
질문자

types라는 폴더를 따로 만들고 그 안에 Request interface를 확장한 interface를 다시 만들었습니다.

// request.interface.ts
import {Request} from "@nestjs/common";
import {UsersModel} from "../users/entities/users.entity";

export interface RequestWithUserAndToken extends Request {
    user: UsersModel,
    token: string,
    tokenType: string,
}
// posts.controller.ts

    @Post()
    @UseGuards(AccessTokenGuard)
    postPosts(
        @Request() req: RequestWithUserAndToken,
        @Body('title') title: string,
        @Body('content') content: string,
    ) {
        const authorId = req.user.id;

        return this.postsService.createPost(authorId, title, content);
    }

선언한 interface를 Request 타입으로 사용해서 컴파일러에게 user 프로퍼티가 있다는 것을 인식하게 했는데

혹시 좋지 못한 방법일까요..?

정민교님의 프로필 이미지
정민교

작성한 질문수

질문하기