События

Сервер NocoBase запускает соответствующие события во время жизненного цикла приложения, жизненного цикла плагина и операций с базой данных. Разработчики плагинов могут прослушивать эти события, чтобы реализовать логику расширения, автоматизированные операции или пользовательское поведение.

Система событий NocoBase в основном разделена на два уровня:

  • app.on() - ​​События уровня приложения: прослушивание событий жизненного цикла приложения, таких как запуск, установка, включение плагинов и т. д.
  • db.on() - ​​События уровня базы данных: прослушивание событий операций на уровне модели данных, таких как создание, обновление, удаление записей и т. д.

Оба наследуют EventEmitter Node.js и поддерживают стандартные интерфейсы .on(), .off(), .emit(). NocoBase также расширяет поддержку emitAsync, используемого для асинхронного запуска событий и ожидания завершения выполнения всеми прослушивателями.

Где регистрировать прослушиватели событий

Прослушиватели событий обычно должны быть зарегистрированы в методе beforeLoad() плагина, чтобы обеспечить готовность событий на этапе загрузки плагина и правильную реакцию последующей логики.

import { Plugin } from '@nocobase/server';

export default class PluginHelloServer extends Plugin {
  async beforeLoad() {

    // Прослушивание событий приложения
    this.app.on('afterStart', () => {
      app.logger.info('NocoBase has started');
    });

    // Прослушивание событий базы данных
    this.db.on('afterCreate', (model) => {
      if (model.collectionName === 'posts') {
        app.logger.info(`New post: ${model.get('title')}`);
      }
    });
  }
}

Прослушивание событий приложения через app.on()

События приложения используются для регистрации изменений жизненного цикла приложений и плагинов NocoBase, что подходит для логики инициализации, регистрации ресурсов или обнаружения зависимостей плагинов.

Распространенные типы событий

Название событияВремя триггераТипичное использование
beforeLoad / afterLoadДо/после загрузки приложенияРегистрация ресурсов, инициализация конфигурации
beforeStart / afterStartДо/после запуска службыЗапуск задач, печать журналов запуска
beforeInstall / afterInstallДо/после установки приложенияИнициализация данных, импорт шаблонов
beforeStop / afterStopДо/после остановки сервисаОчистка ресурсов, сохранение состояния
beforeDestroy / afterDestroyДо/после уничтожения приложенияУдаление кэша, отключение соединений
beforeLoadPlugin / afterLoadPluginДо/после загрузки плагинаИзменение конфигурации плагина или расширение функциональности
beforeEnablePlugin / afterEnablePluginДо/после включения плагинаПроверка зависимостей, инициализация логики плагина
beforeDisablePlugin / afterDisablePluginДо/после отключения плагинаОчистка ресурсов плагина
afterUpgradeПосле завершения обновления приложенияВыполнение миграции данных или исправлений совместимости

Пример: прослушивание события запуска приложения

app.on('afterStart', async () => {
  app.logger.info('🚀 NocoBase service has started!');
});

Пример: прослушивание события загрузки плагина

app.on('afterLoadPlugin', ({ plugin }) => {
  app.logger.info(`Плагин ${plugin.name} загружен`);
});

Прослушивание событий базы данных через db.on()

События базы данных могут фиксировать различные изменения данных на уровне модели, что подходит для аудита, синхронизации, автозаполнения и других операций.

Распространенные типы событий

Название событияВремя триггера
beforeSync / afterSyncДо/после синхронизации структуры базы данных
beforeValidate / afterValidateДо/после проверки данных
beforeCreate / afterCreateДо/после создания записей
beforeUpdate / afterUpdateДо/после обновления записей
beforeSave / afterSaveДо/после сохранения (включая создание и обновление)
beforeDestroy / afterDestroyДо/после удаления записей
afterCreateWithAssociations / afterUpdateWithAssociations / afterSaveWithAssociationsПосле операций, включающих данные связей
beforeDefineCollection / afterDefineCollectionДо/после определения коллекций
beforeRemoveCollection / afterRemoveCollectionДо/после удаления коллекций

Пример: прослушивание события после создания данных

db.on('afterCreate', async (model, options) => {
  db.logger.info('Data has been created!');
});

Пример: прослушивание события перед обновлением данных

db.on('beforeUpdate', async (model, options) => {
  db.logger.info('Data is about to be updated!');
});