tachybase_todo/docs/zh-CN/api/server/application.md
Junyi 796e73ae5a
refactor(doc): change to new structure (#804)
* refactor(doc): change to new structure

* docs: add database docs

* docs: add collection docs

* docs: add db field examples

* docs(api): fix filename and menu path

* docs: add database docs

* docs: add db operators doc

* docs: add resourcer menu

* docs: add resourcer docs

* docs: fix api docs

* docs: refactor api menu structure

* feat: update docs (#830)

* feat: updates

* feat: update docs

* chore: ignore docs from ci

Co-authored-by: Junyi <mytharcher@users.noreply.github.com>
Co-authored-by: mytharcher <mytharcher@gmail.com>

* docs: add database methods docs

* docs: add missed api

* docs: fix api docs

* feat: update development docs (#833)

* feat: update development docs

* feat: update docs

* feat: update docs

* docs: add first plugin example (#834)

* feat: update docs

* feat: update docs

* docs: fix typo

Co-authored-by: chenos <chenlinxh@gmail.com>
2022-09-19 09:23:01 +08:00

268 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Application
NocoBase 的应用程序类,服务端的应用进程将实例化该类并启动。因为继承自 [Koa](https://koajs.com/),所以也可以直接调用 Koa 实例的方法。
同时因为 Koa 还继承自 [EventEmitter](https://nodejs.org/api/events.html#events_class_eventemitter),所以也可以通过 `app.on` 监听事件。
## 构造函数
**签名**
* `constructor(options: ApplicationOptions)`
创建一个应用实例。
**参数**
| 参数名 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| `options.database` | `IDatabaseOptions` or `Database` | `{}` | 数据库配置 |
| `options.resourcer` | `ResourcerOptions` | `{}` | 资源路由配置 |
| `options.cors` | `CorsOptions` | `{}` | 跨域配置,参考 [@koa/cors](https://npmjs.com/package/@koa/cors) |
| `options.dataWrapping` | `boolean` | `true` | 是否包装响应数据,`true` 则将把通常的 `ctx.body` 包装为 `{ data, meta }` 的结构。 |
| `options.registerActions` | `boolean` | `true` | 是否注册默认的 action |
| `options.i18n` | `I18nOptions` | `{}` | 国际化配置,参考 [i18next](https://www.npmjs.com/package/i18next) |
| `options.plugins` | `PluginConfiguration[]` | `[]` | 默认启用的插件配置 |
**示例**
```ts
import Application from '@nocobase/server';
const app = new Application({
database: {
dialect: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: '123456',
database: 'test',
},
resourcer: {
prefix: '/api',
},
cors: {
origin: '*',
}
});
```
## 实例成员
### `db`
应用初始化自动创建的数据库实例,通过 `@nocobase/database` 封装的数据库访问类,相关方法参考 [Database](./database)。
### `resourcer`
应用初始化自动创建的资源路由管理实例,相关方法参考 [Resourcer](./resourcer)。
### `cli`
应用初始化自动创建的命令行工具实例,相关方法参考 [CLI](../cli)。
### `acl`
应用初始化自动创建的访问控制表实例,相关方法参考 [ACL](./acl)。
### `i18n`
应用初始化自动创建的国际化工具实例,相关方法参考 [I18n](./i18n)。
### `appManager`
应用初始化自动创建的应用管理实例,相关方法参考 [AppManager](./app-manager)。
### `pm`
应用初始化自动创建的插件管理器实例,相关方法参考 [PluginManager](./plugin-manager)。
### `context`
继承自 koa 的 context可以通过 `app.context` 访问,用于向每个请求注入上下文可访问的内容。参考 [Koa Context](https://koajs.com/#app-context)。
NocoBase 默认对 context 注入了以下成员,可以在请求处理函数中直接使用:
| 变量名 | 类型 | 描述 |
| --- | --- | --- |
| `ctx.app` | `Application` | 应用实例 |
| `ctx.db` | `Database` | 数据库实例 |
| `ctx.resourcer` | `Resourcer` | 资源路由管理器实例 |
| `ctx.action` | `Action` | 资源操作相关对象实例 |
| `ctx.i18n` | `I18n` | 国际化实例 |
| `ctx.getBearerToken()` | `Function` | 获取请求头中的 bearer token |
## 实例方法
### `getVersion()`
获取当前版本。
**签名**
* `getVersion(): string`
**示例**
```ts
console.log(app.getVersion()); // 0.7.4-alpha.7
```
### `plugin()`
向应用中注册插件的快捷方法,等同于 `app.pm.add()`,参考 [PluginManager](./plugin-manager#add)。
### `loadPluginConfig()`
批量注册插件与默认参数。
**签名**
* `loadPluginConfig(pluginsConfigurations: PluginConfiguration[]): void`
**参数**
| 参数名 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| `pluginsConfigurations[]` | `string` | - | 插件的 npm 包名 |
| `pluginsConfigurations[]` | `[string, any]` | - | 插件的 npm 包名与默认参数 |
### `getPlugin()`
获取已注册的插件实例,等同于 `app.pm.get(name)`,参考 [PluginManager](./plugin-manager#get)。
### `use()`
注册应用级中间件的快捷方法,等同于 `koa.use()`
### `on()`
订阅应用级事件,主要与生命周期相关,等同于 `eventEmitter.on()`。所有可订阅事件参考 [事件](#事件)。
### `collection()`
向数据库注册数据表模型的快捷方法,等同于 `app.db.collection()`,参考 [Database](./database#collection)。
### `resource()`
向资源路由管理器注册资源的快捷方法,等同于 `app.resourcer.define()`,参考 [Resourcer](./resourcer#define)。
### `actions()`
向资源路由管理器注册 action 的快捷方法,等同于 `app.resourcer.registerActions()`,参考 [Resourcer](./resourcer#registerActions)。
### `command()`
向命令行工具注册命令的快捷方法,等同于 `app.cli.command()`,参考 [cli](./cli)。
### `load()`
应用生命周期方法,用于加载所有已注册的插件,等同于 `app.pm.load()`,参考 [PluginManager](./plugin-manager#load)。
**签名**
* `async load(): Promise<void>`
### `start()`
启动应用,如果配置了监听的端口,将启动监听,之后应用即可接受 HTTP 请求。
**签名**
* `async start(options: StartOptions): Promise<void>`
**参数**
| 参数名 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| `options.listen?` | `ListenOptions` | `{}` | HTTP 监听参数对象 |
| `options.listen.port?` | `number` | 13000 | 端口 |
| `options.listen.host?` | `string` | `'localhost'` | 域名 |
**事件**
`start()` 调用会触发两个事件:
* `'beforeStart'`:在应用启动前触发。
* `'afterStart'`:在应用启动后触发。
### `stop()`
停止应用,如果应用正在监听,将停止监听,并关闭数据库连接。
**签名**
* `async stop(options: any): Promise<void>`
| 参数名 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| `options?` | `any` | - | 将透传至停止事件的参数 |
**事件**
`stop()` 调用会触发两个事件:
* `'beforeStop'`:在应用停止前触发。
* `'afterStop'`:在应用停止后触发。
### `destroy()`
销毁并停止应用,包含 `stop()` 的调用。
**事件**
`destroy()` 调用会触发两个事件:
* `'beforeDestroy'`:在应用销毁前触发。
* `'afterDestroy'`:在应用销毁后触发。
插件相关的销毁事件可以基于该事件进行扩展。
### `install()`
应用初始化安装调用接口,用于安装应用的基础数据,包括:
* 同步已通过 `db.collection()``db.import()` 注入的数据库表结构到数据库。
* 调用所有已注册插件实例的 `install()` 方法,执行相应安装过程。
**事件**
* `'beforeInstall'`:在应用安装前触发。
* `'afterInstall'`:在应用安装后触发。
### `upgrade()`
应用调用接口,当更新新版本代码后通过命令行工具调用,用于执行应用的升级过程,包括:
* 数据库迁移工具执行。
**事件**
* `'beforeUpgrade'`:在应用升级前触发。
* `'afterUpgrade'`:在应用升级后触发。
## 事件
应用生命周期会触发相应事件,扩展开发可以基于这些事件进行。
| 事件名称 | 是否异步 | 描述 |
| --- | --- | --- |
| `'beforeInstall'` | 是 | 安装前触发 |
| `'afterInstall'` | 是 | 安装后触发 |
| `'beforeUpgrade'` | 是 | 升级前触发 |
| `'afterUpgrade'` | 是 | 升级后触发 |
| `'beforeStart'` | 是 | 启动前触发 |
| `'afterStart'` | 是 | 启动后触发 |
| `'beforeStop'` | 是 | 停止前触发 |
| `'afterStop'` | 是 | 停止后触发 |
| `'beforeDestroy'` | 是 | 销毁前触发 |
| `'afterDestroy'` | 是 | 销毁后触发 |
**示例**
```ts
app.on('beforeStart', async () => {
console.log('app before start');
});
```