logologo
Começar
Manual
Desenvolvimento
Plugins
API
Início
English
简体中文
日本語
한국어
Español
Português
Deutsch
Français
Русский
Começar
Manual
Desenvolvimento
Plugins
API
Início
logologo
Visão Geral da API

@nocobase/auth

AuthManager
Autenticação
BaseAuth

@nocobase/cache

CacheManager
Cache

@nocobase/cli

NocoBase CLI
Variáveis de Ambiente Globais

@nocobase/client

Aplicação
Plugin

@nocobase/database

Coleção
Campo

interfaces

BaseInterface
Operadores de Filtro

RelationRepository

BelongsToManyRepository
belongs-to-repository
HasManyRepository
HasOneRepository
Repositório

shared

create-options
destroy-options
find-one
find-options
transaction
update-options

@nocobase/data-source-manager

DataSourceManager
DataSource (abstrata)
ICollectionManager
ICollection
IField
IModel
IRepository

@nocobase/flow-engine

Gerenciador de Fonte de Dados
Contexto do Fluxo
FlowEngine
FlowModel
Recurso de Fluxo

@nocobase/logger

Logger

@nocobase/server

AppCommand
Aplicação
AuditManager
Contexto
Migração
Plugin

@nocobase/sdk

Auth
Storage
Previous PagePlugin
Next PageColeção
Aviso de tradução por IA

Esta documentação foi traduzida automaticamente por IA.

#Banco de Dados

#Visão Geral

O Database é a ferramenta de interação com banco de dados fornecida pelo NocoBase, que oferece funcionalidades muito convenientes para aplicações no-code e low-code. Atualmente, os bancos de dados suportados são:

  • SQLite 3.8.8+
  • MySQL 8.0.17+
  • PostgreSQL 10.0+

#Conectar ao Banco de Dados

No construtor de Database, você pode configurar a conexão do banco de dados passando o parâmetro options.

const { Database } = require('@nocobase/database');

// Parâmetros de configuração para banco de dados SQLite
const database = new Database({
  dialect: 'mysql',
  host: 'localhost',
  port: 3306,
  database: 'nocobase',
  username: 'root',
  password: 'password'
})

// Parâmetros de configuração para banco de dados MySQL \ PostgreSQL
const database = new Database({
  dialect: /* 'postgres' ou 'mysql' */,
  database: 'database',
  username: 'username',
  password: 'password',
  host: 'localhost',
  port: 'port'
})

Para parâmetros de configuração detalhados, consulte Construtor.

#Definição de Modelo de Dados

O Database define a estrutura do banco de dados através de coleção. Um objeto coleção representa uma tabela no banco de dados.

// Define a coleção
const UserCollection = database.collection({
  name: 'users',
  fields: [
    {
      name: 'name',
      type: 'string',
    },
    {
      name: 'age',
      type: 'integer',
    },
  ],
});

Após definir a estrutura do banco de dados, você pode usar o método sync() para sincronizá-la.

await database.sync();

Para um uso mais detalhado de coleção, consulte Coleção.

#Leitura e Escrita de Dados

O Database opera nos dados através de Repository.

const UserRepository = UserCollection.repository();

// Criar
await UserRepository.create({
  name: 'João',
  age: 18,
});

// Consultar
const user = await UserRepository.findOne({
  filter: {
    name: 'João',
  },
});

// Atualizar
await UserRepository.update({
  values: {
    age: 20,
  },
});

// Excluir
await UserRepository.destroy(user.id);

Para um uso mais detalhado das operações CRUD de dados, consulte Repository.

#Construtor

Assinatura

  • constructor(options: DatabaseOptions)

Cria uma instância de banco de dados.

Parâmetros

ParâmetroTipoValor PadrãoDescrição
options.hoststring'localhost'Host do banco de dados
options.portnumber-Porta do serviço de banco de dados, com uma porta padrão correspondente ao banco de dados utilizado.
options.usernamestring-Nome de usuário do banco de dados
options.passwordstring-Senha do banco de dados
options.databasestring-Nome do banco de dados
options.dialectstring'mysql'Tipo de banco de dados
options.storage?string':memory:'Modo de armazenamento para SQLite
options.logging?booleanfalseSe deve habilitar o registro de logs
options.define?Object{}Parâmetros de definição de tabela padrão
options.tablePrefix?string''Extensão NocoBase, prefixo do nome da tabela
options.migrator?UmzugOptions{}Extensão NocoBase, parâmetros relacionados ao gerenciador de migrações, consulte a implementação Umzug.

#Métodos Relacionados a Migrações

#addMigration()

Adiciona um único arquivo de migração.

Assinatura

  • addMigration(options: MigrationItem)

Parâmetros

ParâmetroTipoValor PadrãoDescrição
options.namestring-Nome do arquivo de migração
options.context?string-Contexto do arquivo de migração
options.migration?typeof Migration-Classe personalizada para a migração
options.upFunction-Método up do arquivo de migração
options.downFunction-Método down do arquivo de migração

Exemplo

db.addMigration({
  name: '20220916120411-test-1',
  async up() {
    const queryInterface = this.context.db.sequelize.getQueryInterface();
    await queryInterface.query(/* seus SQLs de migração */);
  },
});

#addMigrations()

Adiciona arquivos de migração de um diretório especificado.

Assinatura

  • addMigrations(options: AddMigrationsOptions): void

Parâmetros

ParâmetroTipoValor PadrãoDescrição
options.directorystring''Diretório onde os arquivos de migração estão localizados
options.extensionsstring[]['js', 'ts']Extensões de arquivo
options.namespace?string''Namespace
options.context?Object{ db }Contexto do arquivo de migração

Exemplo

db.addMigrations({
  directory: path.resolve(__dirname, './migrations'),
  namespace: 'test',
});

#Métodos Utilitários

#inDialect()

Verifica se o tipo de banco de dados atual é um dos tipos especificados.

Assinatura

  • inDialect(dialect: string[]): boolean

Parâmetros

ParâmetroTipoValor PadrãoDescrição
dialectstring[]-Tipo de banco de dados, valores possíveis são mysql/postgres/mariadb

#getTablePrefix()

Obtém o prefixo do nome da tabela da configuração.

Assinatura

  • getTablePrefix(): string

#Configuração de Coleção

#collection()

Define uma coleção. Esta chamada é semelhante ao método define do Sequelize, criando a estrutura da tabela apenas em memória. Para persistir no banco de dados, você precisa chamar o método sync.

Assinatura

  • collection(options: CollectionOptions): Collection

Parâmetros

Todos os parâmetros de configuração de options são consistentes com o construtor da classe coleção, consulte Coleção.

Eventos

  • 'beforeDefineCollection': Acionado antes de definir uma coleção.
  • 'afterDefineCollection': Acionado após definir uma coleção.

Exemplo

db.collection({
  name: 'books',
  fields: [
    {
      type: 'string',
      name: 'title',
    },
    {
      type: 'float',
      name: 'price',
    },
  ],
});

// sincroniza a coleção como tabela no banco de dados
await db.sync();

#getCollection()

Obtém uma coleção definida.

Assinatura

  • getCollection(name: string): Collection

Parâmetros

ParâmetroTipoValor PadrãoDescrição
namestring-Nome da coleção

Exemplo

const collection = db.getCollection('books');

#hasCollection()

Verifica se uma coleção especificada foi definida.

Assinatura

  • hasCollection(name: string): boolean

Parâmetros

ParâmetroTipoValor PadrãoDescrição
namestring-Nome da coleção

Exemplo

db.collection({ name: 'books' });

db.hasCollection('books'); // true

db.hasCollection('authors'); // false

#removeCollection()

Remove uma coleção definida. É removida apenas da memória; para persistir a alteração, você precisa chamar o método sync.

Assinatura

  • removeCollection(name: string): void

Parâmetros

ParâmetroTipoValor PadrãoDescrição
namestring-Nome da coleção

Eventos

  • 'beforeRemoveCollection': Acionado antes de remover uma coleção.
  • 'afterRemoveCollection': Acionado após remover uma coleção.

Exemplo

db.collection({ name: 'books' });

db.removeCollection('books');

#import()

Importa todos os arquivos em um diretório como configurações de coleção para a memória.

Assinatura

  • async import(options: { directory: string; extensions?: ImportFileExtension[] }): Promise<Map<string, Collection>>

Parâmetros

ParâmetroTipoValor PadrãoDescrição
options.directorystring-Caminho do diretório a ser importado
options.extensionsstring[]['ts', 'js']Escaneia por sufixos específicos

Exemplo

A coleção definida no arquivo ./collections/books.ts é a seguinte:

export default {
  name: 'books',
  fields: [
    {
      type: 'string',
      name: 'title',
    },
  ],
};

Importe a configuração relevante quando o plugin carregar:

class Plugin {
  async load() {
    await this.app.db.import({
      directory: path.resolve(__dirname, './collections'),
    });
  }
}

#Registro e Recuperação de Extensões

#registerFieldTypes()

Registra tipos de campo personalizados.

Assinatura

  • registerFieldTypes(fieldTypes: MapOf<typeof Field>): void

Parâmetros

fieldTypes é um par chave-valor onde a chave é o nome do tipo de campo e o valor é a classe do tipo de campo.

Exemplo

import { Field } from '@nocobase/database';

class MyField extends Field {
  // ...
}

db.registerFieldTypes({
  myField: MyField,
});

#registerModels()

Registra classes de modelo de dados personalizadas.

Assinatura

  • registerModels(models: MapOf<ModelStatic<any>>): void

Parâmetros

models é um par chave-valor onde a chave é o nome do modelo de dados e o valor é a classe do modelo de dados.

Exemplo

import { Model } from '@nocobase/database';

class MyModel extends Model {
  // ...
}

db.registerModels({
  myModel: MyModel,
});

db.collection({
  name: 'myCollection',
  model: 'myModel',
});

#registerRepositories()

Registra classes de Repository personalizadas.

Assinatura

  • registerRepositories(repositories: MapOf<RepositoryType>): void

Parâmetros

repositories é um par chave-valor onde a chave é o nome do Repository e o valor é a classe do Repository.

Exemplo

import { Repository } from '@nocobase/database';

class MyRepository extends Repository {
  // ...
}

db.registerRepositories({
  myRepository: MyRepository,
});

db.collection({
  name: 'myCollection',
  repository: 'myRepository',
});

#registerOperators()

Registra operadores de consulta de dados personalizados.

Assinatura

  • registerOperators(operators: MapOf<OperatorFunc>)

Parâmetros

operators é um par chave-valor onde a chave é o nome do operador e o valor é a função que gera a instrução de comparação.

Exemplo

db.registerOperators({
  $dateOn(value) {
    return {
      [Op.and]: [
        { [Op.gte]: stringToDate(value) },
        { [Op.lt]: getNextDay(value) },
      ],
    };
  },
});

db.getRepository('books').count({
  filter: {
    createdAt: {
      // operador registrado
      $dateOn: '2020-01-01',
    },
  },
});

#getModel()

Obtém uma classe de modelo de dados definida. Se nenhuma classe de modelo personalizada foi registrada anteriormente, ele retornará a classe de modelo padrão do Sequelize. O nome padrão é o mesmo que o nome da coleção.

Assinatura

  • getModel(name: string): Model

Parâmetros

ParâmetroTipoValor PadrãoDescrição
namestring-Nome do modelo registrado

Exemplo

db.registerModels({
  books: class MyModel extends Model {},
});

const ModelClass = db.getModel('books');

console.log(ModelClass.prototype instanceof MyModel); // true

Nota: A classe de modelo obtida de uma coleção não é estritamente igual à classe de modelo registrada, mas herda dela. Como as propriedades da classe de modelo do Sequelize são modificadas durante a inicialização, o NocoBase lida automaticamente com essa relação de herança. Exceto pela desigualdade da classe, todas as outras definições podem ser usadas normalmente.

#getRepository()

Obtém uma classe de Repository personalizada. Se nenhuma classe de Repository personalizada foi registrada anteriormente, ele retornará a classe de Repository padrão do NocoBase. O nome padrão é o mesmo que o nome da coleção.

As classes de Repository são usadas principalmente para operações CRUD baseadas em modelos de dados, consulte Repository.

Assinatura

  • getRepository(name: string): Repository
  • getRepository(name: string, relationId?: string | number): Repository

Parâmetros

ParâmetroTipoValor PadrãoDescrição
namestring-Nome do Repository registrado
relationIdstring | number-Valor da chave estrangeira para dados relacionais

Quando o nome é um nome de associação como 'tables.relations', ele retornará a classe de Repository associada. Se o segundo parâmetro for fornecido, o Repository será baseado no valor da chave estrangeira dos dados relacionais ao ser usado (consultar, atualizar, etc.).

Exemplo

Suponha que existam duas coleções, posts e authors, e a coleção de posts tem uma chave estrangeira apontando para a coleção de authors:

const AuthorsRepo = db.getRepository('authors');
const author1 = AuthorsRepo.create({ name: 'author1' });

const PostsRepo = db.getRepository('authors.posts', author1.id);
const post1 = AuthorsRepo.create({ title: 'post1' });
asset(post1.authorId === author1.id); // true

#Eventos do Banco de Dados

#on()

Escuta por eventos do banco de dados.

Assinatura

  • on(event: string, listener: (...args: any[]) => void | Promise<void>): void

Parâmetros

ParâmetroTipoValor PadrãoDescrição
eventstring-Nome do evento
listenerFunction-Listener de evento

Os nomes dos eventos suportam os eventos de Model do Sequelize por padrão. Para eventos globais, escute usando o formato <sequelize_model_global_event>, e para eventos de Model único, use o formato <model_name>.<sequelize_model_event>.

Para descrições de parâmetros e exemplos detalhados de todos os tipos de eventos integrados, consulte a seção Eventos Integrados.

#off()

Remove uma função de listener de evento.

Assinatura

  • off(name: string, listener: Function)

Parâmetros

ParâmetroTipoValor PadrãoDescrição
namestring-Nome do evento
listenerFunction-Listener de evento

Exemplo

const listener = async (model, options) => {
  console.log(model);
};

db.on('afterCreate', listener);

db.off('afterCreate', listener);

#Operações do Banco de Dados

#auth()

Autenticação da conexão do banco de dados. Pode ser usada para garantir que a aplicação estabeleceu uma conexão com os dados.

Assinatura

  • auth(options: QueryOptions & { retry?: number } = {}): Promise<boolean>

Parâmetros

ParâmetroTipoValor PadrãoDescrição
options?Object-Opções de autenticação
options.retry?number10Número de tentativas em caso de falha na autenticação
options.transaction?Transaction-Objeto de transação
options.logging?boolean | FunctionfalseSe deve imprimir logs

Exemplo

await db.auth();

#reconnect()

Reconecta ao banco de dados.

Exemplo

await db.reconnect();

#closed()

Verifica se a conexão do banco de dados está fechada.

Assinatura

  • closed(): boolean

#close()

Fecha a conexão do banco de dados. Equivalente a sequelize.close().

#sync()

Sincroniza a estrutura da coleção do banco de dados. Equivalente a sequelize.sync(), para parâmetros consulte a documentação do Sequelize.

#clean()

Limpa o banco de dados, excluindo todas as coleções.

Assinatura

  • clean(options: CleanOptions): Promise<void>

Parâmetros

ParâmetroTipoValor PadrãoDescrição
options.dropbooleanfalseSe deve remover todas as coleções
options.skipstring[]-Configuração dos nomes das coleções a serem ignoradas
options.transactionTransaction-Objeto de transação

Exemplo

Remove todas as coleções, exceto a coleção users.

await db.clean({
  drop: true,
  skip: ['users'],
});

#Exportações em Nível de Pacote

#defineCollection()

Cria o conteúdo de configuração para uma coleção.

Assinatura

  • defineCollection(name: string, config: CollectionOptions): CollectionOptions

Parâmetros

ParâmetroTipoValor PadrãoDescrição
collectionOptionsCollectionOptions-O mesmo que todos os parâmetros de db.collection()

Exemplo

Para um arquivo de configuração de coleção a ser importado por db.import():

import { defineCollection } from '@nocobase/database';

export default defineCollection({
  name: 'users',
  fields: [
    {
      type: 'string',
      name: 'name',
    },
  ],
});

#extendCollection()

Estende o conteúdo da configuração de estrutura de coleção já em memória, usado principalmente para o conteúdo de arquivos importados pelo método import(). Este método é um método de nível superior exportado pelo pacote @nocobase/database e não é chamado através de uma instância db. O alias extend também pode ser usado.

Assinatura

  • extendCollection(collectionOptions: CollectionOptions, mergeOptions?: MergeOptions): ExtendedCollectionOptions

Parâmetros

ParâmetroTipoValor PadrãoDescrição
collectionOptionsCollectionOptions-O mesmo que todos os parâmetros de db.collection()
mergeOptions?MergeOptions-Parâmetros para o pacote npm deepmerge

Exemplo

Definição original da coleção de livros (books.ts):

export default {
  name: 'books',
  fields: [{ name: 'title', type: 'string' }],
};

Definição estendida da coleção de livros (books.extend.ts):

import { extend } from '@nocobase/database';

// estender novamente
export default extend({
  name: 'books',
  fields: [{ name: 'price', type: 'number' }],
});

Se os dois arquivos acima forem importados ao chamar import(), após serem estendidos novamente com extend(), a coleção de livros terá os campos title e price.

Este método é muito útil para estender estruturas de coleção já definidas por plugins existentes.

#Eventos Integrados

O banco de dados aciona os eventos correspondentes a seguir em diferentes estágios de seu ciclo de vida. Ao se inscrever neles com o método on(), você pode realizar processamentos específicos para atender a certas necessidades de negócio.

#'beforeSync' / 'afterSync'

Acionado antes e depois que uma nova configuração de estrutura de coleção (campos, índices, etc.) é sincronizada com o banco de dados. Geralmente é acionado quando collection.sync() (chamada interna) é executado e é usado para lidar com a lógica de extensões de campo especiais.

Assinatura

on(eventName: `${string}.beforeSync` | 'beforeSync' | `${string}.afterSync` | 'afterSync', listener: SyncListener): this

Tipo

import type { SyncOptions, HookReturn } from 'sequelize/types';

type SyncListener = (options?: SyncOptions) => HookReturn;

Exemplo

const users = db.collection({
  name: 'users',
  fields: [{ type: 'string', name: 'username' }],
});

db.on('beforeSync', async (options) => {
  // faça algo
});

db.on('users.afterSync', async (options) => {
  // faça algo
});

await users.sync();

#'beforeValidate' / 'afterValidate'

Antes de criar ou atualizar dados, há um processo de validação baseado nas regras definidas na coleção. Eventos correspondentes são acionados antes e depois da validação. Isso é acionado quando repository.create() ou repository.update() é chamado.

Assinatura

on(eventName: `${string}.beforeValidate` | 'beforeValidate' | `${string}.afterValidate` | 'afterValidate', listener: ValidateListener): this

Tipo

import type { ValidationOptions } from 'sequelize/types/lib/instance-validator';
import type { HookReturn } from 'sequelize/types';
import type { Model } from '@nocobase/database';

type ValidateListener = (
  model: Model,
  options?: ValidationOptions,
) => HookReturn;

Exemplo

db.collection({
  name: 'tests',
  fields: [
    {
      type: 'string',
      name: 'email',
      validate: {
        isEmail: true,
      },
    },
  ],
});

// todos os modelos
db.on('beforeValidate', async (model, options) => {
  // faça algo
});
// modelo tests
db.on('tests.beforeValidate', async (model, options) => {
  // faça algo
});

// todos os modelos
db.on('afterValidate', async (model, options) => {
  // faça algo
});
// modelo tests
db.on('tests.afterValidate', async (model, options) => {
  // faça algo
});

const repository = db.getRepository('tests');
await repository.create({
  values: {
    email: 'abc', // verifica o formato do e-mail
  },
});
// ou
await repository.update({
  filterByTk: 1,
  values: {
    email: 'abc', // verifica o formato do e-mail
  },
});

#'beforeCreate' / 'afterCreate'

Eventos correspondentes são acionados antes e depois de criar um registro. Isso é acionado quando repository.create() é chamado.

Assinatura

on(eventName: `${string}.beforeCreate` | 'beforeCreate' | `${string}.afterCreate` | 'afterCreate', listener: CreateListener): this

Tipo

import type { CreateOptions, HookReturn } from 'sequelize/types';
import type { Model } from '@nocobase/database';

export type CreateListener = (
  model: Model,
  options?: CreateOptions,
) => HookReturn;

Exemplo

db.on('beforeCreate', async (model, options) => {
  // faça algo
});

db.on('books.afterCreate', async (model, options) => {
  const { transaction } = options;
  const result = await model.constructor.findByPk(model.id, {
    transaction,
  });
  console.log(result);
});

#'beforeUpdate' / 'afterUpdate'

Eventos correspondentes são acionados antes e depois de atualizar um registro. Isso é acionado quando repository.update() é chamado.

Assinatura

on(eventName: `${string}.beforeUpdate` | 'beforeUpdate' | `${string}.afterUpdate` | 'afterUpdate', listener: UpdateListener): this

Tipo

import type { UpdateOptions, HookReturn } from 'sequelize/types';
import type { Model } from '@nocobase/database';

export type UpdateListener = (
  model: Model,
  options?: UpdateOptions,
) => HookReturn;

Exemplo

db.on('beforeUpdate', async (model, options) => {
  // faça algo
});

db.on('books.afterUpdate', async (model, options) => {
  // faça algo
});

#'beforeSave' / 'afterSave'

Eventos correspondentes são acionados antes e depois de criar ou atualizar um registro. Isso é acionado quando repository.create() ou repository.update() é chamado.

Assinatura

on(eventName: `${string}.beforeSave` | 'beforeSave' | `${string}.afterSave` | 'afterSave', listener: SaveListener): this

Tipo

import type { SaveOptions, HookReturn } from 'sequelize/types';
import type { Model } from '@nocobase/database';

export type SaveListener = (model: Model, options?: SaveOptions) => HookReturn;

Exemplo

db.on('beforeSave', async (model, options) => {
  // faça algo
});

db.on('books.afterSave', async (model, options) => {
  // faça algo
});

#'beforeDestroy' / 'afterDestroy'

Eventos correspondentes são acionados antes e depois de excluir um registro. Isso é acionado quando repository.destroy() é chamado.

Assinatura

on(eventName: `${string}.beforeDestroy` | 'beforeDestroy' | `${string}.afterDestroy` | 'afterDestroy', listener: DestroyListener): this

Tipo

import type { DestroyOptions, HookReturn } from 'sequelize/types';
import type { Model } from '@nocobase/database';

export type DestroyListener = (
  model: Model,
  options?: DestroyOptions,
) => HookReturn;

Exemplo

db.on('beforeDestroy', async (model, options) => {
  // faça algo
});

db.on('books.afterDestroy', async (model, options) => {
  // faça algo
});

#'afterCreateWithAssociations'

Este evento é acionado após criar um registro com dados de associação hierárquica. É acionado quando repository.create() é chamado.

Assinatura

on(eventName: `${string}.afterCreateWithAssociations` | 'afterCreateWithAssociations', listener: CreateWithAssociationsListener): this

Tipo

import type { CreateOptions, HookReturn } from 'sequelize/types';
import type { Model } from '@nocobase/database';

export type CreateWithAssociationsListener = (
  model: Model,
  options?: CreateOptions,
) => HookReturn;

Exemplo

db.on('afterCreateWithAssociations', async (model, options) => {
  // faça algo
});

db.on('books.afterCreateWithAssociations', async (model, options) => {
  // faça algo
});

#'afterUpdateWithAssociations'

Este evento é acionado após atualizar um registro com dados de associação hierárquica. É acionado quando repository.update() é chamado.

Assinatura

on(eventName: `${string}.afterUpdateWithAssociations` | 'afterUpdateWithAssociations', listener: CreateWithAssociationsListener): this

Tipo

import type { UpdateOptions, HookReturn } from 'sequelize/types';
import type { Model } from '@nocobase/database';

export type UpdateWithAssociationsListener = (
  model: Model,
  options?: UpdateOptions,
) => HookReturn;

Exemplo

db.on('afterUpdateWithAssociations', async (model, options) => {
  // faça algo
});

db.on('books.afterUpdateWithAssociations', async (model, options) => {
  // faça algo
});

#'afterSaveWithAssociations'

Este evento é acionado após criar ou atualizar um registro com dados de associação hierárquica. É acionado quando repository.create() ou repository.update() é chamado.

Assinatura

on(eventName: `${string}.afterSaveWithAssociations` | 'afterSaveWithAssociations', listener: SaveWithAssociationsListener): this

Tipo

import type { SaveOptions, HookReturn } from 'sequelize/types';
import type { Model } from '@nocobase/database';

export type SaveWithAssociationsListener = (
  model: Model,
  options?: SaveOptions,
) => HookReturn;

Exemplo

db.on('afterSaveWithAssociations', async (model, options) => {
  // faça algo
});

db.on('books.afterSaveWithAssociations', async (model, options) => {
  // faça algo
});

#'beforeDefineCollection'

Acionado antes que uma coleção seja definida, por exemplo, quando db.collection() é chamado.

Nota: Este é um evento síncrono.

Assinatura

on(eventName: 'beforeDefineCollection', listener: BeforeDefineCollectionListener): this

Tipo

import type { CollectionOptions } from '@nocobase/database';

export type BeforeDefineCollectionListener = (
  options: CollectionOptions,
) => void;

Exemplo

db.on('beforeDefineCollection', (options) => {
  // faça algo
});

#'afterDefineCollection'

Acionado depois que uma coleção é definida, por exemplo, quando db.collection() é chamado.

Nota: Este é um evento síncrono.

Assinatura

on(eventName: 'afterDefineCollection', listener: AfterDefineCollectionListener): this

Tipo

import type { Collection } from '@nocobase/database';

export type AfterDefineCollectionListener = (options: Collection) => void;

Exemplo

db.on('afterDefineCollection', (collection) => {
  // faça algo
});

#'beforeRemoveCollection' / 'afterRemoveCollection'

Acionado antes e depois que uma coleção é removida da memória, por exemplo, quando db.removeCollection() é chamado.

Nota: Este é um evento síncrono.

Assinatura

on(eventName: 'beforeRemoveCollection' | 'afterRemoveCollection', listener: RemoveCollectionListener): this

Tipo

import type { Collection } from '@nocobase/database';

export type RemoveCollectionListener = (options: Collection) => void;

Exemplo

db.on('beforeRemoveCollection', (collection) => {
  // faça algo
});

db.on('afterRemoveCollection', (collection) => {
  // faça algo
});