Nestjs에서 Cron을 활용하여 동적 스케줄링 작업을 구현하던 중 this.schedulerRegistery.addCronJob(name, job);의 addCronJob의 두번째 인수(job) 부분에서 아래와 같은 에러가 발생했다.
import { Injectable, Logger, Inject, LoggerService } from '@nestjs/common';
import { SchedulerRegistry } from '@nestjs/schedule';
import { CronJob } from 'cron';
@Injectable()
export class TaskService {
constructor(
@Inject(Logger)
private readonly logger: LoggerService,
private schedulerRegistery: SchedulerRegistry,
) {
this.insert();
}
insert() {
const name = 'test';
const job = new CronJob('* * * * * *', () => {
this.logger.warn(`run! ${name}`);
});
this.schedulerRegistery.addCronJob(name, job);
this.logger.warn('job added');
}
}
import("c:/Users/USER/Documents/OHA-Common-Service/node_modules/cron/dist/job").CronJob<null, null>' 형식의 인수는 'import("c:/Users/USER/Documents/OHA-Common-Service/node_modules/@nestjs/schedule/node_modules/cron/dist/job").CronJob<null, null>' 형식의 매개 변수에 할당될 수 없습니다. 'cronTime' 속성의 형식이 호환되지 않습니다. 'import("c:/Users/USER/Documents/OHA-Common-Service/node_modules/cron/dist/time").CronTime' 형식은 'import("c:/Users/USER/Documents/OHA-Common-Service/node_modules/@nestjs/schedule/node_modules/cron/dist/time").CronTime' 형식에 할당할 수 없습니다. 형식에 별도의 프라이빗 속성 'second' 선언이 있습니다.ts(2345) const job: CronJob<null, null> 빠른 수정을 사용할 수 없음
예제를 보고 그대로 따라 쳤는데 왜 저런 에러가 나왔을까 의아했다. 구글링을 해도 해결방법을 전혀 찾지 못했다.
에러를 자세히 읽어보니 두 개의 서로 다른 모듈에서 CronJob을 가져와서 혼동이 발생하고 있는 것으로 보였다. 한 모듈에서는 @nestjs/schedule/node_modules/cron에서 가져온 CronJob을 사용하고 있고, 다른 모듈에서는 직접 cron에서 가져온 CronJob을 사용하고 있는 것 같았다.
즉, cron 라이브러리의 CronJob 인스턴스와 nestjs/schedule의 schedulerRegistery가 서로 호환이 되지 않아 나온 문제인 듯 싶었다.
yarn add @types/cron
yarn add @types/cron --dev
모두 다시 설치해봐도 해결되지 않았다.
그러다 문득, 이 문제를 해결하려면 모듈을 통일하면 되지 않을까 라는 생각이 들었다. 즉 모든 곳에서 동일한 CronJob을 가져와야 서로 호환이 되지 않을까 싶었다.
pacakage.json에서 @nestjs/schedule모듈과 @types/cron모듈의 버전을 확인해보니 각각 4.0.0, 2.4.0이어서 두 모듈의 버전을 일치시켜보기로 하였다.
맨 처음에는 @types/cron의 제일 최신 버전인 2.4.0버전에 맞춰 @nestjs/schedule도 2.4.0으로 맞추려고 했으나, @nestjs/schedule은 2.4.0을 지원하지 않았다. 따라서 둘 다 2.2.0버전으로 수정 후, 모듈 업데이트를 위해 yarn install
을 실행해보았다.
다행히 해결되었다.