はじめまして、エンジニアのクロサキです。

先日、社内向けシステムにSails.jsというNode.jsのMVCフレームワークを使って開発する機会がありました。
Sails.js自体は非常に便利なのですが、開発していて日本語のリソースが少ないなという気がしたので、せっかくなので開発時に得た知識を、逆引きリファレンス的に書いていこうかと思います。なお、Node.jsやSails.jsのインストールやセットアップについては、日本語でも紹介されている方がいらっしゃるので、ここでは割愛します。

Sails.jsって?

そもそもSails.jsって何?という方が多いかと思いますので、まずは簡単にSails.jsが何者なのか紹介したいと思います。
Sails.jsは、expressというNode.jsの軽量なMVCフレームワークをベースに、最近のWEBサービスではよく使われているような機能を標準搭載した、Railsライクなフレームワークです。expressでは、それ自体が持っている機能は最小限なため、他に必要な機能は別途組み込む必要がありましたが、Sails.jsはそれらの機能が設定ファイルの変更だけで済んでしまうことが多いです。
そのため、あまり開発に時間をかけられないようなプロジェクトなどにおいては、基本的な機能の開発時間を短縮できるため、威力を発揮します。
Sails.jsの主な特徴としては、
・RESTful JSON APIの自動生成
・ORM
・Socket.ioの標準搭載
・Gruntでのファイル圧縮
と、こんな感じです。
もちろん、Sails.jsに無い機能はnpmからパッケージを追加して組み込むことが可能ですし、またexpressがベースとなっているため、expressで実現できていたことはSails.jsでもできると思います。

ユーザ認証にPassportを使うには?

Passportとは、Node.js向けの認証機能ライブラリです。Passportを使用すると、FacebookやTwitterのOAuthを使用したユーザ認証や、GoogleのOpenIDを使用したユーザ認証を少ないコードで実現することができます。

PassportをSails.jsで使用する場合、Sails.jsのベースとなっているexpressに対し、Passportを使えるようにしてあげる必要があります。そのため、まずはSails.jsの/config以下に、Passport用の設定ファイルを追加します。今回は、認証にGoogleのOpenID認証を使用します。

次に、下記のURLの受け口となるControllerファイルを追加します。

  1. 上記コードで、returnURLで指定したURL
  2. 画面上のログイン用リンクなどに設定されるURL
  3. ログアウト用URL

あとは、package.jsonに忘れずにパッケージを追加しておきましょう。以上でSails.jsでもPassportが使用できるようになります。

ユーザ認証の状態によって、レスポンスデータを変えるには?

1個目に続き、認証系の話題です。

APIにリクエストされた際、ユーザがログインしている場合のみデータを返したいという事があるかと思います。Sails.jsにはPoliciesというACL系の挙動を制御する機能が実装されているので、あとは設定さえすれば使える状態になります。

今回使用するのは、/api/policies/isAuthenticated.jsというファイル(バージョンによってはsessionAuth.js)と、/config/policies.jsというファイルです。isAuthenticated.jsについては、そのままの状態で今回の内容を満たしているので、特に変更はありません。

なので、policies.jsに設定を追加します。

上記のコードを見ても分かるとおり、設定はController内の各メソッド単位で行うことができます。そのため、特定のメソッドのみsessionAuth.jsを適用したい!という場合にも対応できます。

また、各メソッドに適用できるポリシーは、配列形式で複数適用させることもできます。例えば、ログイン状態を確認するポリシーとユーザの権限を確認するポリシーなどを別々のファイルに分けておけば、メソッド毎に適用するポリシーが異なる場合でも、柔軟に対応できます。

APIのURLとController名、メソッド名を紐付けるには?

Sails.jsには、REST Blueprintsという機能が実装されているので、基本は/api/controllers以下にControllerファイルを追加して、そこにメソッドを追加すればURLとしてリクエストできる状態になります。ただ場合によっては、URLとController名、メソッド名を別のものにしたいという事もあるかと思います。そのような場合は、/config/route.jsに設定を追加してあげることで、URL名とController名が異なる場合でも紐付けることができます。

REST APIにバージョン番号を振るには?

REST Blueprintsで紐付けられるURLは、/[Controller]/[メソッド]のような形式なので、Controllerの前にAPIのバージョン番号を振ることができません。

APIのバージョン番号を振るには、/config/blueprints.jsにあるprefixに値を設定することで、全てのControllerのURLに、プレフィックスとして値が付けられます。

まとめ

今回4つほど紹介しましたが、いずれも/config以下のファイルを編集しています。

冒頭でも紹介しましたが、Sails.jsは標準で搭載している機能が多く、またそれらの機能を制御する設定周りが充実しているので、少しのコードを書くだけで済んでしまうようなケースが数多くあります。

また機会がありましたら、他の設定項目や、テストコードなど設定以外の部分についても触れたいと思います。

最後まで読んでいただき、ありがとうございました。