通常、Sailsはコマンドラインインターフェースを通じて操作し、sails liftでサーバーを起動しますが、Sailsアプリケーションは、プログラムインターフェースを使用することで、他のNodeアプリケーション内から起動および操作することもできます。このインターフェースの主な用途の1つは、自動テストスイート内でSailsアプリケーションを実行することです。
Node.jsスクリプト内から新しいSailsアプリを作成するには、Sailsのコンストラクターを使用します。同じコンストラクターを使用して、必要なだけ異なるSailsアプリを作成できます。
var Sails = require('sails').constructor;
var mySailsApp = new Sails();
var myOtherSailsApp = new Sails();
新しいSailsアプリへの参照を取得したら、.load()または.lift()を使用して起動できます。どちらのメソッドも、構成オプションのディクショナリと、Sailsアプリが起動した後に実行されるコールバック関数の2つの引数を取ります。
Sailsがプログラムで起動されると、現在の作業ディレクトリの下にある
api、config、およびその他のフォルダーを使用して、コントローラー、モデル、および構成オプションがロードされます。注目すべき例外は、この方法でアプリを起動する場合、.sailsrcファイルはロードされないことです。
.load()または.lift()に引数として送信された構成オプションは、他の場所からロードされたオプションよりも優先されます。
環境変数で設定された構成オプションは、
NODE_ENVとPORTを除き、プログラムで起動されたSailsアプリには自動的に適用されません。
.sailsrcファイルと環境変数から構成オプションをロードするには、Sailsがrequire('sails/accessible/rc')経由で利用可能にしているrcモジュールを使用します。
.load()と.lift()の違いは、.lift()が追加の手順として、(1)アプリのbootstrap(存在する場合)を実行し、(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 |
モデルID(小文字のモデル名)をモデル定義にマッピングするディクショナリ。 |
| ポリシー | policies.moduleDefinitions |
ポリシー名(例:isAdmin)をポリシー関数にマッピングするディクショナリ。 |
Sailsのプログラムインターフェースの完全なリファレンスは、リファレンス > アプリケーションで入手できます。