Bull Quere란?
- Redis를 기반으로 하는 분산 큐 라이브러리
- 대기열에 작업을 추가하고 작업자들이 해당 작업을 처리
- ex) 요청이 몰릴때 분산하고, 지연 시간을 설정하여 부하를 줄임.
Nest.js mp3파일을 업로드하는 bull Queue코드작성
app.module.ts
- redis에 저장
@Module({
imports: [
BullModule.forRoot({
redis: {
host: 'localhost',
port: 6379,
},
}),
AudioModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
audio.controller.ts
import { InjectQueue } from '@nestjs/bull';
import {
Controller,
Post,
UploadedFile,
UseInterceptors,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { Queue } from 'bull';
import { diskStorage } from 'multer';
import { Express } from 'express';
import { extname } from 'path';
@Controller('audio')
export class AudioController {
//생성자에서 'audio' 큐 주입
constructor(@InjectQueue('audio') private readonly audioQueue: Queue) {}
// /audio/trnascode로 POST 요청 엔드포인트 설정
@Post('transcode')
//@UseInterceptors 데코레이터를 사용하여 파일 업로드 처리에 FileInterceptor 사용
//파일 업로드시 key=audio라는 필드이름으로 받아옴
//업로드된 파일은 diskStorage 스토리지 엔진을 사용하여 ./uploads 디렉토리에 저장
@UseInterceptors(
FileInterceptor('audio', {
storage: diskStorage({
// destination: './uploads', // 파일이 업로드될 디렉토리를 지정합니다.
filename: (req, file, callback) => {
const uniqueName = Date.now(); // 파일 이름을 고유하게 만들기 위해 현재 시간을 사용합니다.
const extension = extname(file.originalname); // 파일의 원본 확장자를 추출합니다.
callback(null, `${uniqueName}${extension}`);
},
}),
}),
)
//메소드 정의 업로드된 파일을 받아와서 오디오 변환작업 처리
async transcode(@UploadedFile() file: Express.Multer.File): Promise<number> {
const filename = file.filename; // 폼데이터로 전송된 파일의 고유한 이름을 받아옵니다.
//
await this.audioQueue.add('transcode', {
filename: filename, // 파일 이름을 'filename' 키로 전달합니다.
});
const queueLength = await this.audioQueue.getWaitingCount(); // 대기 중인 큐의 길이를 얻어옵니다.
const position = queueLength + 1; // 작업이 몇 번째 큐에 삽입되었는지 계산합니다.
return position;
}
}
}
audio.processor.ts
import { Process, Processor } from '@nestjs/bull';
import { Logger } from '@nestjs/common';
import { Job } from 'bull';
//'audio'라는 이름의 bull프로세서를 생성, audio 큐와 연결되어있으며
//해당 큐에 추가된 작업을 처리하는 역할
@Processor('audio')
export class AudioProcessor {
//클래스내에서 로그를 기록하기 위한 logger 인스턴스 생성
private readonly logger = new Logger(AudioProcessor.name);
//@Process('transcode')데코레이터 사용하여 'transcode'라는 이름의
//작업을 처리하는 메소드 정의 => 이 메소드는 오디오 변환 작업을 처리하는 역할
@Process('transcode')
// handleTranscode 메소드 정의, 이 메소드는 bull에서 자동으로 호출됨
//인자로 현재 처리중인 작업 ('job' 객체)를 전달받음
handleTranscode(job: Job) {
//오디오 변환 작업이 시작되었음을 콘솔에 나타냄
this.logger.debug('Start transcoding...');
//작업의 데이터를 디버그 레벨로 로그에 기록, 작업의 데이터는 큐에 추가 될때
//'this.audioQueue.add('transcode'.{file: 'audio.mp3'})' 에서 전달한 {file: audio.mp3}객체
this.logger.debug(job.data);
//메세지를 디버그 레벨로 로그에 기록, 이 메세지는 작업이 완료되었음을 콘솔로 나타냄
this.logger.debug('Transcoding completed');
}
}
Postman요청
- localhost:3000/audio/transcode 경로로 post요청
- audio 필드를 가진 mp3파일 업로드후 form-data로 전송
응답
- processsor에 입력한 로그들이 콘솔에 기록
- 저장된 파일 이름을 콘솔에 나타내고 변환 작업완료.
저장된 파일 확인
- Redis에 방금 전송한 파일이 잘 저장됨
에러
- express multer 모듈을 불러올 수 없는 에러발생
해결방법
- multer 모듈을 설치하여 오류해결
npm install --save @types/multer
https://stackoverflow.com/questions/75688293/namespace-global-express-has-no-exported-member-multer
Namespace 'global.Express' has no exported member 'Multer'
Namespace 'global.Express' has no exported member 'Multer'. Been straggling with this error for 2 days now. I've tried: import "multer" import { Multer } from "multer" import {
stackoverflow.com
'개발일지' 카테고리의 다른 글
Nest.js DB연동 (0) | 2023.08.13 |
---|---|
Nest MySQL 연동 (0) | 2023.07.27 |
Nest.js 초기설정 (0) | 2023.07.15 |
개발일지 86일차 (0) | 2023.07.03 |
개발일지 85일차 (0) | 2023.06.29 |