如何在应用程序或功能模块加载时显式执行一些代码?

时间:2018-12-01 16:40:16

标签: node.js typescript dependency-injection nestjs

我有一个简单的NestJS网络应用。我已经编写了自己的简单任务计划程序,并将其注入到全局模块中。实际上,这非常简单,您只需向其传递一个函数和一个日期,它将在给定日期执行该函数,或者,如果您传递一些其他选项,它将以循环方式执行。

scheduler.add(myFunc, myDate);

我的项目由功能模块构成,每个功能模块都有自己的控制器和服务。由于http请求,某些任务会添加到调度程序中,在这种情况下,添加任务非常简单,您可以在处理相关请求的服务方法中正确地执行此任务。但是,某些任务,尤其是一些重复性任务,需要在应用程序或模块加载时添加。我计划有一个与每个功能模块相关联的文件,其中包含所有需要在应用程序或模块加载时向我的调度程序注册的重复任务。我的第一个直觉是文件可能看起来像这样:

feature.scheduled-tasks.ts

import { Scheduler } from './src/scheduler';
import { Model } from '@nestjs/common';
import { UserModel } from '.src/who/cares/you/get/the/idea';
import { SomeService } from '.src/see/above';

// I need Nest to inject the Scheduler here
const scheduler: Scheduler 

// I need Nest to inject some other feature related providers here,
// like Mongoose database models and other services
const userModel: Model<UserModel>;
const someService: SomeService;

const firstTask = () => {
  // do stuff using the userModel
}

const secondTask = () => {
  // do stuff using someService
}

scheduler.add(firstTask, {units: 5, measure: 'dayOfMonth'});
scheduler.add(secondTask, {units: 17, measure: 'dayOfMonth'});

要使其正常工作,我有两个问题/疑问:

  1. 如何让Nest将所需的提供程序注入此文件中?
  2. 我如何告诉Nest在应用程序或功能模块加载时运行此文件的内容?

1 个答案:

答案 0 :(得分:1)

直接在模块本身或其一个提供程序(服务)中初始化模块时,可以使用Lifecycle Event来运行代码。

export class FeatureModule implements OnModuleInit {
                           ^^^^^^^^^^^^^^^^^^^^^^^

  constructor(private scheduler: Scheduler,
              private someService: SomeService, 
              ...) {}

  onModuleInit() {
    // ...
    this.scheduler.add(firstTask, {units: 5, measure: 'dayOfMonth'});
  }
}

当然,您也可以将feature.scheduled-tasks.ts编写为普通提供程序,以注入所有必需的依赖项并实现OnModuleInit生命周期事件本身。