Event

Server NocoBase memicu event yang sesuai pada siklus hidup aplikasi, siklus hidup plugin, serta operasi database. Anda dapat mengimplementasikan logika ekstensi, operasi otomatisasi, atau perilaku kustom dengan mendengarkan event-event ini.

Sistem event NocoBase utamanya dibagi menjadi dua level:

  • app.on() — Event Level Aplikasi: Mendengarkan event siklus hidup aplikasi, seperti startup, instalasi, aktivasi plugin, dll.
  • db.on() — Event Level Database: Mendengarkan event operasi pada level model data, seperti membuat, memperbarui, menghapus record, dll.

Keduanya diwarisi dari EventEmitter Node.js, mendukung penggunaan interface standar .on(), .off(), .emit(). NocoBase juga memperluas emitAsync, untuk memicu event secara asinkron dan menunggu semua listener selesai dieksekusi.

Lokasi Registrasi Event Listener

Event listener biasanya didaftarkan di method beforeLoad() plugin, sehingga dapat dipastikan event sudah siap pada tahap loading plugin, dan logika berikutnya dapat merespons dengan benar.

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

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

    // Listen event aplikasi
    this.app.on('afterStart', () => {
      app.logger.info('NocoBase telah dimulai');
    });

    // Listen event database
    this.db.on('afterCreate', (model) => {
      if (model.collectionName === 'posts') {
        app.logger.info(`Post baru: ${model.get('title')}`);
      }
    });
  }
}

Listen Event Aplikasi app.on()

Event aplikasi digunakan untuk menangkap perubahan siklus hidup aplikasi NocoBase dan plugin, cocok untuk logika inisialisasi, registrasi resource, atau deteksi dependensi, dll.

Tipe Event Umum

Nama EventWaktu TriggerPenggunaan Tipikal
beforeLoad / afterLoadSebelum / setelah aplikasi dimuatMendaftarkan resource, menginisialisasi konfigurasi
beforeStart / afterStartSebelum / setelah service dimulaiMemulai task, mencetak log startup
beforeInstall / afterInstallSebelum / setelah aplikasi diinstalMenginisialisasi data, mengimpor template
beforeStop / afterStopSebelum / setelah service dihentikanMembersihkan resource, menyimpan status
beforeDestroy / afterDestroySebelum / setelah aplikasi dihancurkanMenghapus cache, memutuskan koneksi
beforeLoadPlugin / afterLoadPluginSebelum / setelah plugin dimuatMemodifikasi konfigurasi plugin atau memperluas fungsi
beforeEnablePlugin / afterEnablePluginSebelum / setelah plugin diaktifkanMemeriksa dependensi, menginisialisasi logika plugin
beforeDisablePlugin / afterDisablePluginSebelum / setelah plugin dinonaktifkanMembersihkan resource plugin
afterUpgradeSetelah upgrade aplikasi selesaiMengeksekusi migrasi data atau perbaikan kompatibilitas

Misalnya listen event startup aplikasi:

app.on('afterStart', async () => {
  app.logger.info('Service NocoBase telah dimulai');
});

Misalnya listen event loading plugin:

app.on('afterLoadPlugin', ({ plugin }) => {
  app.logger.info(`Plugin ${plugin.name} telah dimuat`);
});

Listen Event Database db.on()

Event database digunakan untuk menangkap berbagai perubahan data pada level model, cocok untuk audit, sinkronisasi, auto-fill, dan operasi lainnya.

Tipe Event Umum

Nama EventWaktu Trigger
beforeSync / afterSyncSebelum / setelah sinkronisasi struktur database
beforeValidate / afterValidateSebelum / setelah validasi data
beforeCreate / afterCreateSebelum / setelah membuat record
beforeUpdate / afterUpdateSebelum / setelah update record
beforeSave / afterSaveSebelum / setelah save (termasuk create dan update)
beforeDestroy / afterDestroySebelum / setelah delete record
afterCreateWithAssociations / afterUpdateWithAssociations / afterSaveWithAssociationsSetelah operasi termasuk data asosiasi
beforeDefineCollection / afterDefineCollectionSebelum / setelah mendefinisikan collection
beforeRemoveCollection / afterRemoveCollectionSebelum / setelah menghapus collection

Misalnya listen event setelah data dibuat:

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

Misalnya listen event sebelum data diperbarui:

db.on('beforeUpdate', async (model, options) => {
  db.logger.info('Data akan diperbarui');
});

Tautan Terkait