Page Contents
Page Contents

See also:

See also:

概要

LoopBack的 bootstrapper, loopback-boot, 执行应用的初始化。当一个应用启动的时候,bootstrapper会:

  • 配置数据源
  • 定义自定义模型
  • 配置模型被将模型赋到对用的数据源上
  • 配置应用settings
  • 运行/server/boot目录下的启动脚本.

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);
...

详细请见loopback-boot API docs

启动脚本(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 - Binds loopback.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:

  1. 应用对象app。可以通过这个对象进入系统定义的变量和配置。
  2. 一个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.js02-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数组的顺序来执行脚本。

你可以在通过bootDirs属性设置一个或多个文件夹,这写文件夹里面的脚本也会按照文件名排序来执行,这些脚本的执行发生在bootScripts之后,/server/boot文件里面的脚本之前。