EggBornJS新增了Startup
机制,允许在系统启动时执行初始化工作
Startup
的开发机制与Schedule
类似
声明Startup
src/module/test-party/backend/src/config/config.js
module.exports = appInfo => {
const config = {};
// startups
config.startups = {
startupAll: {
type: 'worker',
path: 'test/feat/startup/all',
},
startupInstance: {
type: 'worker',
instance: true,
path: 'test/feat/startup/instance',
},
};
return config;
};
名称 | 说明 |
---|---|
type | all/worker |
path | 需要执行的后端API路由 |
instance | 系统调用后端API路由时,是否需要向上下文环境注入实例信息 |
属性
instance
的本质是什么?
- 前面我们提到EggBornJS支持多实例。由于Startup是由系统触发执行的,此时上下文环境是没有
实例
信息的- 如果
instance
设为false,那么后端API路由
就需要自行处理与多实例相关的逻辑- 如果
instance
设为true,那么系统就会自动对多实例进行循环,依次调用后端API路由
,并向上下文环境注入实例信息,从而简化后端API路由
的开发工作量
声明API路由
src/module/test-party/backend/src/routes.js
// test/feat/startup
{ method: 'post', path: 'test/feat/startup/all', controller: testFeatStartup, middlewares: 'inner', meta: { instance: { enable: false } } },
{ method: 'post', path: 'test/feat/startup/instance', controller: testFeatStartup, middlewares: 'inner', meta: { auth: { enable: false } } },
名称 | 说明 |
---|---|
middlewares | 指定中间件inner ,只允许内部调用 |
instance.enable | 禁止全局中间件instance |
auth.enable | 禁止全局中间件auth |
为何要禁止全局中间件
auth
?
- 因为Schedule是由系统触发执行的,其上下文环境没有
用户
信息
为何不同时禁止全局中间件
instance
和auth
?
- 由于中间件
auth
依赖中间件instance
,如果禁止中间件instance
,那么中间件auth
就会自动被禁止
添加控制器方法
src/module/test-party/backend/src/controller/test/feat/startup.js
const require3 = require('require3');
const assert = require3('assert');
module.exports = app => {
class StartupController extends app.Controller {
async all() {
console.log('test/feat/startup: all');
assert.equal(this.ctx.instance, undefined);
this.ctx.success();
}
async instance() {
console.log(`test/feat/startup: instance:${this.ctx.instance.id}`);
assert(this.ctx.instance.id > 0);
this.ctx.success();
}
}
return StartupController;
};
评论: