通常、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のプログラムインターフェースの完全なリファレンスは、リファレンス > アプリケーションで入手できます。