Page Contents

Overview

主要なLoopBackのJavaScriptオブジェクトは以下のものです。

コードの場所(起動スクリプトの中・モデルのJavaScriptファイル/common/models/model.jsの中など)に応じてこれらのオブジェクトの参照を取得する方法は、 とても知りたいことだと思います。

app オブジェクトを取得する

app オブジェクトの参照を取得できれば、その他のモデルやデータソースなどのオブジェクトも取得できるので、これを取得することは、極めて重要です。 appオブジェクトを操作したい場所はだいたい以下のようになります。

  • モデルスクリプト: /common/models/_モデル名_.js (モデル名 にはモデルの名前が入ります).
  • /server/boot 内の起動スクリプト
  • ミドルウェア (起動スクリプトで登録するか、/server/server.js にあるもの)
  • 自身の独自スクリプト

app オブジェクトは、典型的なLBアプリケーションの様々な場所で、コンテキストを提供します。

起動スクリプトから

起動スクリプト内で、appオブジェクトの参照を取得するには、公開された関数の最初の引数で受け取ります。

コールバック関数を持つ非同期の起動スクリプトの場合、

Asynchronous boot script - /server/boot/your-script.js

module.exports = function(app, cb) { // LoopBack が app を注入する
  //...
};

コールバック関数のない同期起動スクリプトの場合、

Synchronous boot script - /server/boot/your-script.js

module.exports = function(app) { // LoopBack が app を注入する
  //...
};

それぞれの例から分かる通り、LoopBackは自動的にappオブジェクトを、起動スクリプトの最初の引数として渡します。

起動スクリプトについて、詳しくは起動スクリプトの定義 を参照してください。

ミドルウェアから

LoopBackは、自動的にappオブジェクトをミドルウェアのrequestオブジェクトの中にセットします(実際には裏側でExpressがそれをやっています)。 server/server.js において、以下のようにアクセス可能です。

Middleware - /server/server.js

...
app.use(function(req, res, next) {
  var app = req.app;
  //...
});
...

ミドルウェアに関する詳細は、ミドルウェアの定義 を参照してください。

独自スクリプトから

独自のスクリプトから appを参照する必要がある場合、(モデルの例のように)単に取り込むだけです。

A custom script - /server/your-script.js

var app = require('/server/server');
...

その他のNodeモジュールと同じように、/server/server.jsを取り込みます。

モデルスクリプトから

モデル生成ツールによって作られたモデルの中でappオブジェクトを扱うには、 その他のNodeモジュールと同じように「取り込み」ます。

Model - /common/models/book.js

var app = require('../../server/server'); // 他のnode.jsアプリのように`server.js` を取り込む

module.exports = function(Book) {
  //...
};

モデルがあれば、特殊な方法が使えます。/common/models/model.js を除くあらゆる場所で、モデルのmodel.appを通じてappの参照を取得することができます。

例えば以下のように。

...
Book.app
...

しかし、一つ注意しなければならないのは、/common/models/model.js の中では、model.appが参照できないということです。なぜなら、このファイルは起動が完全に終わるまでappプロパティを追加しないからです。 /common/models/model.js では、以下のようなことが できません

モデルスクリプトではできません

module.exports = function(Book) {
  Book.app... // `.app` はまだBookオブジェクトに追加されていないため動作しない。
});

ただし、リモートメソッド・リモートフック・モデルフックの内側であれば、appの参照を使うことができます。これらは、アプリケーションの読み込みが完了した後に実行されるからです。(それは、loopback.boot が実行された後、あるいは /server/server.js で boot(..)が呼び出された後です)

以下のことは できます

module.exports = function(Book) {
  Book.read(cb) {
    var app = Book.app;
    console.log(app.models...)
    cb();
  };
  Book.remoteMethod(
    'read',
    ...
  });
};

もちろん、同じことがリモートフックやリモートメソッドでも可能ですが、読み込みタイミングには気をつけてください。 単純に言えば、model.appは、/server/server.jsboot() が実行されて、アプリケーションが完全に起動し終わるまでは利用できません。 この考え方は、アプリケーションに追加される 前に モデルを定義しているためです。 アプリケーションが起動完了したら、モデルの app プロパティにアクセスできるようになります。

appオブジェクトにアクセスする最も簡単な方法は、Model.on('attached') イベントを介するものです。

module.exports = function(MyModel) {
  var app;
  MyModel.on('attached', function(a) {
    app = a;
    // app オブジェクトが必要なセットアップを行う。
  });
};

app オブジェクトを扱う

LoopBackのappオブジェクトは、メインスクリプトで以下のように定義されています。

/server/server.js

var loopback = require('loopback');
var app = loopback();

appオブジェクトは、Expressのappオブジェクトを拡張しており、全てのプロパティやメソッドを継承しており、 LoopBackのappオブジェクトで追加されたプロパティやメソッド同様に使えます。

モデルオブジェクトを扱う

モデルの参照を取得する

appオブジェクをと扱えるようになったら、特定のモデルはappオブジェクトのmodelsプロパティを介して扱うことができます。

起動スクリプト - /server/boot/your-script.js

module.exports = function(app) {
  var app = app.models.Book;
  //...
};

独自スクリプトにおいては、

独自スクリプト - /server/your-script.js

var app = require('/server/server');

モデルオブジェクトを使用する

基本的なモデルオブジェクトの情報は、基本的なモデルオブジェクトを参照ください。 永続化データソースに接続されたモデルに関する情報は、接続されたモデルオブジェクトを参照ください。

関連のないモデルの参照を取得する

関連のあるモデルは、MyModel.app.models.MyRelatedModelのように、簡単に参照することができます。 しかし、関連のない他のモデルの場合は、このようにいきません。このような場合、参照を取得するにはappオブジェクトを使う必要があります。

require('../../server/server')

例えば、オブザーバー(フック)の中でUserモデルを参照したいとすると、以下のようになります。

common/models/my-model.js

module.exports = function(MyModel) {
  var app = require('../../server/server');

  MyModel.observe('loaded', function( ctx, next) {
   var User = app.models.User;
   ...
   User.create(...);
   ...
});

データソースオブジェクトを扱う

データソースの参照を取得する

モデルを扱えるようにするのに似て、まず、appオブジェクトを扱えるようにし、その上で app.datasources プロパティにアクセスします。

起動スクリプト - /server/boot/your-script.js

module.exports = function(app) {
  var dataSource = app.datasources.db; // db は`/server/datasources.json` に登録されたデータソースならなんでもよい
  ...
};

そして、独自スクリプトでは以下のようにします。

独自スクリプト - /server/your-script.js

var app = require('./server/server');
...
var datasource = app.datasources.db;
...

ミドルウェアでは以下のようにします。

ミドルウェア - /server/server.js

...
app.use(function(req, res, next) {
  var dataSource = app.datasources.db;
  ...
});
...

モデルでは以下のようにします。

モデル - /common/models/model.js

module.exports = function(Book) {
  Book.read = function() {
    var dataSource = Book.app.datasources.db;
  };
  Book.remoteMethod(
    'read',
     ...
  );
};

モデルでは、以下のような書き方では 動作しません ので注意してください。

モデル - /common/models/model.js

module.exports = function(Book) {
  Book.app... //`Book` にはまだ登録されていないので動作しません!
};

データソースオブジェクトを使用する