通常,您将通过其 命令行界面 与 Sails 进行交互,使用 sails lift
启动服务器,但 Sails 应用程序也可以通过使用 程序化接口 在其他 Node 应用程序内部启动和操作。此接口的主要用途之一是在自动化测试套件中运行 Sails 应用程序。
要从 Node.js 脚本中创建新的 Sails 应用程序,请使用 Sails 的构造函数。相同的构造函数可用于创建任意数量的不同 Sails 应用程序
var Sails = require('sails').constructor;
var mySailsApp = new Sails();
var myOtherSailsApp = new Sails();
获得新 Sails 应用程序的引用后,您可以使用 .load()
或 .lift()
来启动它。这两种方法都接受两个参数:一个配置选项字典和一个在 Sails 应用程序启动后将运行的回调函数。
以编程方式启动 Sails 时,它仍将使用当前工作目录下的
api
、config
和其他文件夹来加载控制器、模型和配置选项。一个值得注意的例外是,以这种方式启动应用程序时不会加载.sailsrc
文件。
作为参数发送到
.load()
或.lift()
的任何配置选项都将优先于从任何其他地方加载的选项。
通过环境变量设置的配置选项不会自动应用于以编程方式启动的 Sails 应用程序,但
NODE_ENV
和PORT
除外。
要从
.sailsrc
文件和环境变量加载配置选项,请使用 Sails 通过require('sails/accessible/rc')
提供的rc
模块。
.load()
和.lift()
之间的区别在于,.lift()
还执行以下额外步骤:(1)运行应用程序的 引导(如果有),以及(2)在通过sails.config.port
(默认为 1337)配置的端口上启动 HTTP 服务器。这允许您向已启动的应用程序发出 HTTP 请求。要向使用.load()
启动的应用程序发出请求,您可以使用已加载应用程序的 .request()
方法。
在端口 1338 上使用.lift()
启动应用程序,并通过 HTTP 发送 POST 请求
var request = require('request');
var Sails = require('sails').constructor;
var mySailsApp = new Sails();
mySailsApp.lift({
port: 1338
// Optionally pass in any other programmatic config overrides you like here.
}, function(err) {
if (err) {
console.error('Failed to lift app. Details:', err);
return;
}
// --•
// Make a request using the "request" library and display the response.
// Note that you still must have an `api/controllers/FooController.js` file
// under the current working directory, with an `index` action,
// or a `/foo` or `POST /foo` route set up in `config/routes.js`.
request.post('/foo', function (err, response) {
if (err) {
console.log('Could not send HTTP request. Details:', err);
}
else {
console.log('Got response:', response);
}
// >--
// In any case, whether the request worked or not, now we need to call `.lower()`.
mySailsApp.lower(function (err) {
if (err) {
console.log('Could not lower Sails app. Details:',err);
return;
}
// --•
console.log('Successfully lowered Sails app.');
});//</lower sails app>
});//</request.post() :: send http request>
});//</lift sails app>
使用当前环境和 .sailsrc 设置使用.lift()
启动应用程序
var Sails = require('sails').constructor;
var rc = require('sails/accessible/rc');
var mySailsApp = new Sails();
mySailsApp.lift(rc('sails'), function(err) {
});
这是前面示例的另一种方法:使用.load()
启动 Sails 应用程序并发送语义上相同的 POST 请求,但这次我们将使用虚拟请求而不是 HTTP
mySailsApp.load({
// Optionally pass in any programmatic config overrides you like here.
}, function(err) {
if (err) {
console.error('Failed to load app. Details:', err);
return;
}
// --•
// Make a request using the "request" method and display the response.
// Note that you still must have an `api/controllers/FooController.js` file
// under the current working directory, with an `index` action,
// or a `/foo` or `POST /foo` route set up in `config/routes.js`.
mySailsApp.request({url:'/foo', method: 'post'}, function (err, response) {
if (err) {
console.log('Could not send virtual request. Details:', err);
}
else {
console.log('Got response:', response);
}
// >--
// In any case, whether the request worked or not, now we need to call `.lower()`.
mySailsApp.lower(function (err) {
if (err) {
console.log('Could not lower Sails app. Details:',err);
return;
}
// --•
console.log('Successfully lowered Sails app.');
});//</lower sails app>
});//</send virtual request to sails app>
});//</load sails app (but not lift!)>
要以编程方式停止应用程序,请使用.lower()
mySailsApp.lower(function(err) {
if (err) {
console.log('An error occured when attempting to stop app:', err);
return;
}
// --•
console.log('Lowered app successfully.');
});
moduleDefinitions
添加操作、模型等警告:使用
moduleDefinitions
设置声明式加载模块目前处于实验阶段,并且可能会发生重大更改,甚至在主要版本发布之间。在使用此设置之前,请确保项目的 Sails 依赖项已固定到一个确切的版本(即没有^
)。
每当 Sails 应用程序启动时,它通常会加载并初始化存储在api/*
中的所有模块(例如,来自api/models
的模型、来自api/policies
的策略等)。您可以通过在作为第一个参数传递给.load()
或.lift()
的运行时配置中指定它们来添加其他模块,使用moduleDefinitions
键。这主要在运行测试时很有用。
以下 Sails 模块可以以编程方式添加
模块类型 | 配置键 | 详情 |
---|---|---|
操作 | controllers.moduleDefinitions |
一个字典,将 独立操作 路径映射到操作定义(经典 或 Actions2)。 |
助手 | helpers.moduleDefinitions |
一个字典,将助手名称映射到助手定义。 |
模型 | orm.moduleDefinitions.models |
一个字典,将模型标识(小写模型名称)映射到模型定义。 |
策略 | policies.moduleDefinitions |
一个字典,将策略名称(例如isAdmin )映射到策略函数。 |
Sails 程序化接口的完整参考可在 参考 > 应用程序 中找到。