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

정민교님의 프로필 이미지

작성한 질문수

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

AccessTokenGuard 적용해보기

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

24.03.31 23:04 작성

·

187

0

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

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

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

답변 2

0

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

2024. 04. 01. 09:30

안녕하세요!

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

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

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

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

감사합니다!

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

2024. 04. 04. 22:45

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

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

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

2024. 04. 08. 09:37

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

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

0

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

2024. 03. 31. 23:19

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 프로퍼티가 있다는 것을 인식하게 했는데

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