Event - Sự kiện

Server NocoBase trong các giai đoạn vòng đời ứng dụng, vòng đời Plugin và thao tác database, đều sẽ kích hoạt các sự kiện (Event) tương ứng. Bạn có thể lắng nghe các sự kiện này để triển khai logic mở rộng, thao tác tự động hoặc hành vi tùy chỉnh.

Hệ thống sự kiện của NocoBase chủ yếu chia làm hai cấp:

  • app.on() — Sự kiện cấp ứng dụng: Lắng nghe các sự kiện vòng đời của ứng dụng, ví dụ khởi động, cài đặt, bật Plugin, v.v.
  • db.on() — Sự kiện cấp database: Lắng nghe các sự kiện thao tác cấp model dữ liệu, ví dụ tạo, cập nhật, xóa bản ghi, v.v.

Cả hai đều kế thừa từ EventEmitter của Node.js, hỗ trợ dùng các interface tiêu chuẩn .on(), .off(), .emit(). NocoBase còn mở rộng emitAsync, dùng để kích hoạt sự kiện bất đồng bộ và đợi tất cả listener thực thi xong.

Vị trí đăng ký lắng nghe sự kiện

Việc lắng nghe sự kiện thường được đăng ký trong phương thức beforeLoad() của Plugin, như vậy có thể đảm bảo sự kiện đã sẵn sàng trong giai đoạn tải Plugin, các logic tiếp theo có thể phản hồi đúng.

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

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

    // Lắng nghe sự kiện ứng dụng
    this.app.on('afterStart', () => {
      app.logger.info('NocoBase đã khởi động');
    });

    // Lắng nghe sự kiện database
    this.db.on('afterCreate', (model) => {
      if (model.collectionName === 'posts') {
        app.logger.info(`Bài viết mới: ${model.get('title')}`);
      }
    });
  }
}

Lắng nghe sự kiện ứng dụng app.on()

Sự kiện ứng dụng dùng để bắt các thay đổi vòng đời của ứng dụng và Plugin NocoBase, phù hợp để làm logic khởi tạo, đăng ký tài nguyên hoặc kiểm tra phụ thuộc.

Các loại sự kiện phổ biến

Tên sự kiệnThời điểm kích hoạtMục đích điển hình
beforeLoad / afterLoadTrước / sau khi tải ứng dụngĐăng ký tài nguyên, khởi tạo cấu hình
beforeStart / afterStartTrước / sau khi khởi động dịch vụKhởi động tác vụ, in log khởi động
beforeInstall / afterInstallTrước / sau khi cài đặt ứng dụngKhởi tạo dữ liệu, import template
beforeStop / afterStopTrước / sau khi dừng dịch vụDọn dẹp tài nguyên, lưu trạng thái
beforeDestroy / afterDestroyTrước / sau khi hủy ứng dụngXóa cache, ngắt kết nối
beforeLoadPlugin / afterLoadPluginTrước / sau khi tải PluginSửa cấu hình Plugin hoặc mở rộng chức năng
beforeEnablePlugin / afterEnablePluginTrước / sau khi bật PluginKiểm tra phụ thuộc, khởi tạo logic Plugin
beforeDisablePlugin / afterDisablePluginTrước / sau khi tắt PluginDọn dẹp tài nguyên Plugin
afterUpgradeSau khi nâng cấp ứng dụngThực thi migration dữ liệu hoặc fix tương thích

Ví dụ lắng nghe sự kiện khởi động ứng dụng:

app.on('afterStart', async () => {
  app.logger.info('Dịch vụ NocoBase đã khởi động');
});

Ví dụ lắng nghe sự kiện tải Plugin:

app.on('afterLoadPlugin', ({ plugin }) => {
  app.logger.info(`Plugin ${plugin.name} đã được tải`);
});

Lắng nghe sự kiện database db.on()

Sự kiện database dùng để bắt các thay đổi dữ liệu ở tầng model, phù hợp để làm audit, đồng bộ, tự động điền, v.v.

Các loại sự kiện phổ biến

Tên sự kiệnThời điểm kích hoạt
beforeSync / afterSyncTrước / sau khi đồng bộ cấu trúc database
beforeValidate / afterValidateTrước / sau khi validate dữ liệu
beforeCreate / afterCreateTrước / sau khi tạo bản ghi
beforeUpdate / afterUpdateTrước / sau khi cập nhật bản ghi
beforeSave / afterSaveTrước / sau khi lưu (bao gồm tạo và cập nhật)
beforeDestroy / afterDestroyTrước / sau khi xóa bản ghi
afterCreateWithAssociations / afterUpdateWithAssociations / afterSaveWithAssociationsSau khi thao tác bao gồm dữ liệu quan hệ
beforeDefineCollection / afterDefineCollectionTrước / sau khi định nghĩa collection
beforeRemoveCollection / afterRemoveCollectionTrước / sau khi xóa collection

Ví dụ lắng nghe sự kiện sau khi tạo dữ liệu:

db.on('afterCreate', async (model, options) => {
  db.logger.info('Dữ liệu đã được tạo!');
});

Ví dụ lắng nghe sự kiện trước khi cập nhật dữ liệu:

db.on('beforeUpdate', async (model, options) => {
  db.logger.info('Dữ liệu sắp được cập nhật');
});

Liên kết liên quan

  • Plugin — Đăng ký lắng nghe sự kiện trong các phương thức vòng đời Plugin
  • Thao tác Database — Nguồn kích hoạt sự kiện cấp database và API thao tác dữ liệu
  • Collections — Định nghĩa bảng dữ liệu và mối quan hệ model trong sự kiện database
  • Middleware — Sự phối hợp giữa middleware và sự kiện trong xử lý request
  • Tổng quan phát triển server — Vai trò của hệ thống sự kiện trong kiến trúc server