데코레이터의 인자로 클래스내의 프로퍼티 혹은 메서드등을 this로 전달할 수 없나요?
안녕하세요 조현영님. 이번에는 데코레이터에 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"
}
강의자료는 어디서 다운받나요?
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





