See also:
See also:
概要
LoopBack的 bootstrapper, loopback-boot, 执行应用的初始化。当一个应用启动的时候,bootstrapper会:
- 配置数据源
- 定义自定义模型
- 配置模型被将模型赋到对用的数据源上
- 配置应用settings
- 运行
/server/boot
目录下的启动脚本.
Warning:
There is a known issue with boot script ordering. See loopback-boot issue #61.
loopback-boot模块导出一个boot()
函数,它用来初始化应用。例如,一个标准的脚手架的生成的server.js脚本:
/server/server.js
var loopback = require('loopback');
var boot = require('loopback-boot');
var app = module.exports = loopback();
...
boot(app, __dirname);
...
Note:
如果你是使用slc loopback创建应用的, Application generator,那么你不需要做任何事来初始化启动你的应用–自动生成的代码已经自动给我们添加了上面的内容!
启动脚本(Boot scripts)
使用启动脚本来执行一个自定义的初始化工作。当一个应用启动的时候,LoopBack会加载/server/boot目录下面的所有脚本。默认情况下,LoopBack按照字母排序的顺序加载脚本。你可以使用 boot()
的option参数来自定义你启动脚本的加载顺序;详见 Boot script loading order。
application generator创建的标准脚手架在/server/boot文件夹下有下面这些启动脚本:
authentication.js
- 调用app.enableAuth()为应用启动验证。explorer.js
- 启用API Explorer。删除活着修改这个文件的后缀名来禁用API Explorer。rest-api.js
- 使用loopback.rest()中间件通过REST来暴露应用的模型。root.js
- Bindsloopback.status()
middleware at the root endpoint (“/”) to provide basic status information.
自定义启动脚本
你可以定义自定义启动脚本用来在应用启动的时候执行你想要的逻辑。
LoopBack支持异步和同步的启动脚本。异步的启动脚本不会阻塞你程序的执行。
这两种启动脚本都需要导出一个function。他们两的function签名稍有不同,异步启动脚本的functionyou一个额外的callback参数。
下面事一个同步启动脚本的代码:
/server/boot/hello.js
module.exports = function(app) {
console.log('Hello from a boot script');
};
启动function的参数
module.exports = function(app, [_callback_]) { ... }
参数名 | 参数类型 | 是否必填 | 描述 |
---|---|---|---|
app | Object | 是 |
应用的上下文对象。提供应用的操作,例如可以通过它获取模型: var User = app.models.User; |
callback | Function | 异步脚本 | 当你的应用逻辑完成后调用这个callback函数。 |
异步启动脚本
异步启动脚本必须导出一个有两个参数的function:
- 应用对象
app。
可以通过这个对象进入系统定义的变量和配置。 - 一个callback函数。通过它可以响应你的业务逻辑。
Important:
必须调用callback函数。
例如,下面的启动脚本在3秒后打印出”hello world”并触发callback函数。
/server/boot/script.js
module.exports = function(app, callback) {
setTimeout(function() {
console.log('Hello world');
callback();
}, 3000);
};
同步启动脚本
同步启动脚本必须导出一个有一个参数(应用对象app)的function。可以通过这个对象进入系统定义的变量和配置。
下面的例子,打印出所有模型的名字。
/server/boot/script.js
module.exports = function(app) {
var modelNames = Object.keys(app.models);
var models = [];
modelNames.forEach(function(m) {
var modelName = app.models[m].modelName;
if (models.indexOf(modelName) === -1) {
models.push(modelName);
}
});
console.log('Models:', models);
};
输出如下:
shell
...
Models: [ 'User', 'AccessToken', 'ACL', 'RoleMapping', 'Role' ]
...
启动脚本加载顺序
最简单的加载顺序是按照脚本名的排序来加载,LoopBack按照脚本名的顺序来执行启动脚本。例如,你可以这样命名启动脚本01-your-first-script.js
, 02-your-second-script.js。
另外你还可以通过在server/server.js文件的boot函数的option中指定加载顺序:
/server/server.js
...
boot(app, __dirname);
...
With something like this:
...
bootOptions = {
"appRootDir": __dirname,
"bootScripts": ["/full/path/to/boot/script/first.js", "/full/path/to/boot/script/second.js", ...]
};
boot(app, bootOptions);
...
应用会按照bootScripts数组的顺序来执行脚本。
Important:
使用了上面的bootOptions的bootScripts后,在bootScripts中的脚本执行后,应用依然会按照字母的顺序执行/server/boot里面的脚本。
你可以在通过bootDirs属性设置一个或多个文件夹,这写文件夹里面的脚本也会按照文件名排序来执行,这些脚本的执行发生在bootScripts之后,/server/boot文件里面的脚本之前。