inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

데코레이터의 인자로 클래스내의 프로퍼티 혹은 메서드등을 this로 전달할 수 없나요?

해결된 질문

157

이승훈

작성한 질문수 49

1

 안녕하세요 조현영님. 이번에는 데코레이터에 this를 전달하려는데 this에 빨간줄에러가 나서 문의드립니다.

이미지 업로드등을 하기 위해서 아래처럼 MulterProvider라는 provider를 만들고 해당 모듈에 provider에 넣어주었습니다. 

// multer.provider.ts
import { Injectable, Logger } from "@nestjs/common";
import { MulterOptions } from "@nestjs/platform-express/multer/interfaces/multer-options.interface";

import * as fs from "fs";
import * as path from "path";
import * as multer from "multer";

@Injectable()
export class MulterProvider {
  private readonly logger = new Logger("Multer");

  createFolder(folder1: string, folder2: string) {
    try {
      this.logger.log("create uploads folder");
      fs.mkdirSync(path.join(__dirname, "../../../uploads"));
    } catch (err) {
      this.logger.log("uploads folder is already exist");
    }

    try {
      this.logger.log(`create ${folder1}folder into uploads foler`);
      fs.mkdirSync(path.join(__dirname, `../../../uploads/${folder1}`));
    } catch (err) {
      this.logger.log(`${folder1} is already exist`);
    }

    try {
      this.logger.log(`create ${folder2}folder into uploads folder`);
      fs.mkdirSync(path.join(__dirname, `../../../uploads/${folder2}`));
    } catch (err) {
      this.logger.log(`${folder2} is already exist`);
    }
  }

  storage(folder1: string, folder2: string): multer.StorageEngine {
    this.createFolder(folder1, folder2);

    return multer.diskStorage({
      destination(req, file, cb) {
        if (file.mimetype.includes("image")) {
          const folderName = path.join(
            __dirname,
            `../../../uploads/${folder1}`,
          );

          cb(null, folderName);
        } else {
          const folderName = path.join(
            __dirname,
            `../../../uploads/${folder2}`,
          );

          cb(null, folderName);
        }
      },
      filename(req, file, cb) {
        const ext: string = path.extname(file.originalname);

        const fileName = `${path.basename(
          file.originalname,
          ext,
        )}-${Date.now()}${ext}`;

        cb(null, fileName);
      },
    });
  }

  apply(folder1: string, folder2: string) {
    const result: MulterOptions = {
      storage: this.storage(folder1, folder2),
    };
    return result;
  }
}
// upload.module.ts
import { MulterProvider } from "src/model/upload/multer.provider";
import { TypeOrmModule } from "@nestjs/typeorm";
import { Module } from "@nestjs/common";
import { UploadService } from "../upload/services/upload.service";
import { UploadController } from "../upload/controllers/upload.controller";
import { ImagesEntity, VideosEntity } from "./entities/upload.entity";
import { UploadRepository } from "./upload.repository";

@Module({
  imports: [TypeOrmModule.forFeature([ImagesEntity, VideosEntity])],
  controllers: [UploadController],
  providers: [UploadService, UploadRepository, MulterProvider],
  exports: [UploadRepository],
})
export class UploadModule {}

 그리고 이미지를 업로드 할 컨트롤러에 MulterProvider를 적용시키기 위해 아래 처럼하였습니다.

@Controller("upload")
export class UploadController {
  constructor(
    private readonly uploadService: UploadService,
    private readonly multerProvider: MulterProvider,
  ) {}

  @UseInterceptors(
    FileInterceptor("image", this.multerProvider.apply("image", "video")),
  )

이 때 FileInterceptor() 함수의 this가 들어간 인자가 빨간색 에러가 뜨며 에러 내용은 개체가 'undefined'인거 같습니다 라고 뜹니다. 위 예시를 di하지 않고 this.multerProvider 대신 new를 사용해 클래스를 초기화 한다면 정상작동 하기는 합니다.

어찌보면 FileInterceptor에 this로 된 인자를 전달해서 데코레이터에 인자로 준거랑은 다른 맥락인거 같아서 아래처럼 테스트를 해봤는데 this에 '개체가 'undefined'인거 같습니다'라는 에러가 나는 것은 똑같습니다.

 private readonly te = "hello";

  @Get(this.te)
  test() {
   return "hello"
}

 

express nodejs NestJS TypeORM

답변 1

0

제로초(조현영)

데코레이터에서는 this 못 씁니다.

0

이승훈

아쉽네요 감사합니다!

강의자료는 어디서 다운받나요?

0

146

4

질문 있습니다.

0

320

3

코드 편집기 확장 프로그램

0

220

2

(질문)비밀 저장소에 접근하기 위한 인증 정보는 로컬 .env에 저장하는지?

0

165

2

(질문)외부 저장소를 통한 환경변수 불러오기 비동기 질문

0

179

3

로그인을 해도 LoggedInGuard쪽에서 false값이 나옵니다.

0

163

2

로그인방법이 고민됩니다.

0

197

2

yarn seed 명령어 실행 시 데이터 삽입 안됨

0

305

4

yarn run db:create 시에 발생하는 데코레이터 오류

0

249

2

npm run db:create 시에 발생하는 decorating 오류

0

245

2

RxJS 디버깅 질문 있습니다.

0

201

3

CacheManager에 대해 질문 있습니다.

0

185

2

로깅은 어떻게 하는게 효율적일까요?

0

240

1

CORS 질문 있습니다.

0

428

2

쿠키 옵션에 대해서 질문 있습니다.

0

190

2

로그아웃 요청이 403 forbidden 에러가 나는데 왜그런걸까요??

0

458

1

401 unauthorized문제

0

306

1

가드의 장점에 대해서 질문이 있습니다.

0

234

1

로그 관리에 대해 질문 있습니다.

0

256

2

CORS 에러 질문 있습니다.

0

329

2

배포 환경 DB 연결 질문 있습니다.

0

418

2

socket io 미 연결 문제 (nest & flutter)

1

1169

3

no elements in sequence 에러 관해서 질문이 있습니다.

0

466

1

start:dev-backup으로 돌리면 핫 리로딩이 되요 정상인가요?

0

327

1