Как явно выполнить некоторый код при загрузке приложения или функционального модуля? - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть простое веб-приложение 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 голосов
/ 03 декабря 2018

Вы можете использовать Событие жизненного цикла для запуска кода, когда модуль инициализируется либо непосредственно в самом модуле, либо в одном из его провайдеров (служб).

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.

...