domain = require('smoking_cessation_domain').createInstance
baseURL: 'http://localhost:3000/api'
sessionId: 'xxxxxxxxxx'
debug: true
データを格納するサーバーの場所を与える必要がありますので、そのREST APIを定義している場所になります。 ローカルにloopbackサーバーを立ち上げる場合は上記の様に指定し、 devや本番サーバーに接続する際には
https://dev-mbaas.cureapp.net/api
などと指定します。
domain = require('smoking_cessation_domain').createInstance baseURL: ''
こうしておいて
domain.setBaseURL 'localhost:3000/api'
という風にセットできます.
知る必要はありません。 そのあたりのマッピングは base-domain-loopback が担当しています。
これは、loopbackサーバーのセッションです。
- guestユーザー: 何もいれなくていいです.
- 普通のユーザー:自分のセッションをいれないといけません
- adminユーザー: admin用のセッションをいれないといけません
guestユーザーや普通のユーザーだとできることが限られてしまい, loopbackサーバーから
Authorization Required
とか言われて怒られるので、基本的には、アプリサーバーからloopbackに接続するときには admin用のセッションを入れる必要があります。
loopbackが、起動時に、configをみて、決めています. loopbackを起動するスクリプトをみると
require('loopback-with-admin').run(models, config)
などと書かれているかと思いますが,このconfigに
config =
admin:
accessToken: 'xxxx'
とやっておくとこのaccessTokenがセッションidです.
いろんな理由によって、loopback側ではaccessTokenと表現し、 smoking_cessation_domainではsessionIdといっています。
configが設定されていない場合, loopback-with-adminのデフォルトaccessToken値
(you must set access token)
が使われています.
require('loopback-with-admin').run(models, config).then (lbInfo) ->
console.log lbInfo.getAccessToken()
このlbInfo.getAccessToken()の値をsessionIdに入れれば間違いありません.
domain.setSessionId sessionId
ここには書きませんが、しかるべき場所に設定されています. もしくは聞いてください.
どうぞしてください。 なお、 もしlocalにloopbackを立ち上げた場合
http://localhost:3000/explorer
に、APIをちょっと簡単にたたくためのツールがありますので、みてみてください。 そこに accessTokenを入力する場所があるので、sessionIdというべきものを入れてください
しておくと、ひとまずはいろんな情報がでていて安心はすると思います。 特に、loopbackと接続する部分のログがあるので、データの取得や保存が行われるときにどんなREST APIがたたかれているかが わかるでしょう。
ではないです。つまり
domain1 = require('smoking_cessation_domain').createInstance baseURL: 'localhost:3000/api'
domain2 = require('smoking_cessation_domain').createInstance baseURL: 'localhost:3000/api'
console.assert domain1 isnt domain2 # 通る
なので、domainを使う側が常に同じdomainFacadeをみるように頑張る必要があります.
domain.coffee
module.exports = require('smoking_cessation_domain').createInstance
baseURL: 'http://localhost:3000/api'
sessionId: 'xxxxxxxxxx'
debug: true
などとして
domain = require('./domain')
とすればいいです.
doctor siteなどはエレガントな方法で環境変数によって見に行くloopbackを変えるなどの設計をしています.
Hospital = domain.getModel('hospital')
hospital = new Hospital(name: 'xxxx')
もしくは
hospital = domain.createFactory('hospital').createFromObject
name: 'xxxx'
new だと、依存するサブモデルを作ってくれませんが createFromObjectだと、依存するサブモデルも作ってくれます
つまり...
class Hospital extends Entity
@properties:
name: @TYPES.STRING
foo: @TYPES.MODEL 'foo'
たとえばこんなModel定義になっていたとすると
このfoo
というのが、「依存するサブモデル」なんです.
このfooが
class Foo extends Entity
n: @TYPES.NUMBER
というModel定義だった場合、
Foo = facade.getModel('foo')
foo = new Foo(n: 123)
Hospital = facade.getModel('hospital')
hospital = new Hospital(foo: foo, name: 'xxx')
と、fooプロパティにはしっかりfooクラスのインスタンスを与えてあげないといけません.
hospital = facade.createFactory('hospital').createFromObject
foo: n: 123
name: 'xxx'
これで、hospital.foo もFooクラスのインスタンスになってくれます.