Nestjs动态任务调度-上下文丢失

Ste*_*lde 6 cron scheduling typescript nestjs

通过 NestJS 中的声明式任务调度,上下文会保留在计划任务中,因此下面的代码可以正常工作。

@Injectable()
export class SchedulerService {
  private readonly log: Logger;

  constructor(
    @Inject(WINSTON_MODULE_PROVIDER) logger: Logger,
    private schedulerRegistry: SchedulerRegistry
  ) {
    this.log = logger.child({ context: 'scheduler service' });
  }

  @Cron('*/5 * * * * *')
  myScheduledTask(): void {
    this.log.info('test');
  }
Run Code Online (Sandbox Code Playgroud)

然而,动态调度同一个任务时,this.logundefined在scheduled函数中。这怎么可能 ?

@Injectable()
export class SchedulerService {
  private readonly log: Logger;

  constructor(
    @Inject(WINSTON_MODULE_PROVIDER) logger: Logger,
    private schedulerRegistry: SchedulerRegistry
  ) {
    this.log = logger.child({ context: 'scheduler service' });

    const userSyncJob = new CronJob('*/5 * * * * *', this.myScheduledTask);
    schedulerRegistry.addCronJob(syncJobName, userSyncJob);
    userSyncJob.start();
  }

  myScheduledTask(): void {
    this.log.info('test');
  }
}
Run Code Online (Sandbox Code Playgroud)
24/7 08:12:09 [error] Nest : uncaughtException: Cannot read property 'info' of undefined
TypeError: Cannot read property 'info' of undefined
    at CronJob.syncUsers (C:\Users\lcartreul\Documents\projecten\rsa-user-management\src\otherservices\scheduler.service.ts:39:14)
    at CronJob.fireOnTick (C:\Users\lcartreul\Documents\projecten\rsa-user-management\node_modules\cron\lib\cron.js:562:23)
    at Timeout.callbackWrapper [as _onTimeout] (C:\Users\lcartreul\Documents\projecten\rsa-user-management\node_modules\cron\lib\cron.js:629:10)
    at listOnTimeout (internal/timers.js:549:17)
    at processTimers (internal/timers.js:492:7)
Run Code Online (Sandbox Code Playgroud)

coj*_*ack 6

const userSyncJob = new CronJob('*/5 * * * * *', this.myScheduledTask.bind(this));
Run Code Online (Sandbox Code Playgroud)

或者

const userSyncJob = new CronJob('*/5 * * * * *', () => this.myScheduledTask());
Run Code Online (Sandbox Code Playgroud)

不客气