業務的な何かやら、ハッカソンなどで使ったので感想
名前の通り、Ruby on Rails っぽさがあるフレームワークで、
APIづくりなどで力をいかんなく発揮しそう。
良い所
- モデルを定義するだけでRESTなAPIが完成
- アクセス制御周りを簡単に設定できて良し (http://sailsjs.org/#!documentation/policies)
- 簡単な設定でデータベースエンジンの変更が可能。UnitTestでは、memory 使って、結合などでは Mongo つかってといったことができたりする。 (http://sailsjs.org/#!documentation/Database-Support)
テストについては、mocha と supertest 、あと barrels を組み合わせて行っています。
supertest は、テスト用にHTTPリクエストのために使って、barrels は、データベースの初期データなどを用意するために使ってます。以下のような感じでテストが書けてます。
(ココらへんとか参考にしてます。 https://groups.google.com/forum/#!topic/sailsjs/yD6l9ii7R1g)
test/global.test.js
var Sails = require('sails') , barrels = require('barrels'); before(function (done) { Sails.lift({ log: { level: 'error', }, adapters: { // データベースはメモリを使う(テスト終了後に消える) default: 'sails-memory' }, // port は 9999 を利用 port: 9999 }, function (err, sails) { if (err) return done(err); this.app = sails; // これで test/fixtures の下にある json を元にテストデータが作られる // https://github.com/bredikhin/barrels 参照 this.fixtures = barrels.objects; barrels.populate(function (err) { done(err); }); }); }); after(function (done) { sails.lower(done); });
test/FooController.test.js
describe('Foo API', function () { describe('#find()', function () { it('should return ok', function (done) { request(app.express.app) .get('/foo') .set('Accept', 'application/json') .expect('Content-Type', /json/) .expect(200) .end(function (err, res) { assert.equal(err, null); assert.equal(res.body.result, 'ok'); done(); }); }); });
うーん。ってところ。
- 0.9時点の話だが、express.js との連携がべったりしてしまっているため、例えばこの処理を取り除きたいというのができなかったりする。0.10だとその辺の処理がざっと変わるらしい。期待したい。
- ドキュメントに書いていない隠し仕様的なものが、よくあったりするので、結局 sails.js のソースコードを探求することになる。セッションを無効化する場合は、Session 設定の adapter を null にすればよいのだが、この点はドキュメントに一切記されていない。http://sailsjs.org/#!documentation/config.session コントリビュートやらブログなどを書いて、そのへんの知識をまとめていきたい。
- 公式ドキュメントにテストの書き方的なのが記されてない。
- 込み入ったことをやろうとすると、Express.js のドキュメントを読みまくる必要があったりする。
今のところ、0.10.0-rc7 が最新の状態なので、0.10 がリリースされたら、もう一度見てみたいかなと思ってます。