IBM が9月に買収した StrongLoop は、Node.js や Express フレームワークへのコントリビューションの多く、IBM の Node.js による API 開発の中核的な役割になっていくものと思われます。例えば、以下の Watson API リファレンスのサイトは StrongLoop を使って提供されています:
http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/apis/
この StrongLoop (と、前提としての Node.js)そのものは無料で提供されているので、誰でも自分の環境にインストールして使うことができます。 というわけで、CentOS に(Node.js と)StrongLoop をインストールして使ってみました。
StrongLoop は npm で提供されています。なので、まずは Node.js と npm を yum でインストールします:
Node.js と npm がインストールできたら、npm を使って LoopBack と StrongLoop をインストールします:
このインストールにはそれなりに時間がかかりますが、作業としてはこれだけで StrongLoop がインストールできます!
では実際に StrongLoop を使ってデータベースのモデルを作り、その CRUD の REST API を公開してみましょう。 まずは空のディレクトリ(下の例では ~/tmp)を作ってそこに移動します:
このディレクトリに loopback 環境を作成します:
アプリケーションの名前と、そのアプリケーションの作成ディレクトリを聞かれます。ここでは両方とも myapp と指定しました:
すると必要なモジュールのインストールを含めた作業が始まり、完了すると myapp というディレクトリが作られます:
出来上がった myapp ディレクトリに移動して、モデルの定義を行います。以下のコマンドを入力します:
ここからは API で CRUD を行うモデルとして、以下の様な item モデルを定義することにしましょう:
実際にはこの定義に加え、自動的に id という列が定義されます。では最初に myapp アプリ内に item モデルを作成し、これらの3つの列を順に定義していきます。まず model name は "item" を入力します。次に data-source は、今回はデフォルトのメモリ DB を使うので "db (memory)" を選びます。またこのモデルは永続性(persistant)を有効にしたいので、その Base class には "PersistedModel" を指定してします。またこの item は REST API で公開したいので Expose するかどうかの質問には Yes を選択。この item モデルの複数形名にカスタムな名称を使うわけではない(普通に items とする)ので、Custom plural form の質問は空のままで Enter を押します。そしてこのモデルは common モデルにするので "common" を選択します:
次に各列を順に定義します。最初は name 列を定義します。名前には "name" を指定し、その type には "string" を、そして必須かどうかの属性は必須なので "Y" を入力します:
続けて "code" 列を定義します。同様にして名前には "code"、type には "string"、そして必須属性を "Y" で指定します:
最後に "price" 列を定義します。名前には "price"、type には "number" 、必須属性を "N" で指定します:
これで全ての列を指定し終わったので、最後に名前欄を空欄にして Enter を押します。これでモデルの定義が完了です:
ここまでの作業ができたら、カレントディレクトリで node.js を起動します:
すると、デフォルトでは 3000 番ポートで node.js が待受る形で起動します:
この状態で表示されているアドレス(http://(strongloopをインストールしたホスト名):3000/explorer)にブラウザでアクセスしてみると、作成した myapp アプリケーション内に定義されている API の一覧が表示され、その中には item モデルについても含まれているはずです:
item と書かれた箇所をクリックすると展開され、この item モデル向けに用意されている API の一覧が表示されます。特に何もしなくても item モデルの定義をしただけで一通りの CRUD 操作ができるような API が準備されていることがわかります:
用意された API はこの画面から実際に動かして試してみることもできます。例えば一番上にある /items への GET を実行してみましょう。このエントリの /items を書かれた箇所をクリックして開くと、この GET リクエスト API に関する情報が表示されます:
この画面内の "Try it out" と書かれたボタンをクリックすると実際に API を発行することができます。実際にクリックすると curl で実行されたコマンドや実際にリクエストされた API の URL などが確認できます。また Response Body には実行結果が表示されます。この例では実行結果は [] と、空の配列になっているので、実行しても何も得られなかった、ということになります(今はまだ中身がないのでこれで正しい実行結果です):
では実際に item レコードを作ってみましょう。レコードを作成するには POST リクエストを実行することになるので、/items への POST エントリを開き、Parameters 欄の data の部分に以下のようなフォーマットの JSON データを入力して "Try it out!" ボタンをクリックします( "id" は自動割り振りされるので、指定してあってもいなくても構いません。また実際に指定するデータは適当で構いません):
問題なく処理が成功すると、以下の様な結果が得られます。Response Code が 200 になっていれば成功を意味しており、Response Body には以下の様な JSON が返されます("id" の値として 0 を指定していましたが、自動割り振りされた結果の 1 が付与されています)。このデータが正しく追加された、ということになります:
データが正しく追加されたので、改めて再度 /items の GET を実行すると、今度は Response Body の結果は [] ではなく、先程入力したデータが含まれた配列になっているはずです。モデルを定義しただけで自動生成された CRUD の API が( /items の GET と POST だけですが)正しく動いていることが確認できました:
RDB のテーブルに相当するレコードを定義すれば、(コードを書くこともなく)即 CRUD API が用意される、という意味では便利です。
いずれはモニタリングやトレーシングなどもできる StrongLoop Arc についても勉強して、ここで紹介するつもりです。
http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/apis/
この StrongLoop (と、前提としての Node.js)そのものは無料で提供されているので、誰でも自分の環境にインストールして使うことができます。 というわけで、CentOS に(Node.js と)StrongLoop をインストールして使ってみました。
StrongLoop は npm で提供されています。なので、まずは Node.js と npm を yum でインストールします:
# yum install epel-release # yum install nodejs npm --enablerepo=epel
Node.js と npm がインストールできたら、npm を使って LoopBack と StrongLoop をインストールします:
# npm install -g loopback # npm install -g strongloop
このインストールにはそれなりに時間がかかりますが、作業としてはこれだけで StrongLoop がインストールできます!
では実際に StrongLoop を使ってデータベースのモデルを作り、その CRUD の REST API を公開してみましょう。 まずは空のディレクトリ(下の例では ~/tmp)を作ってそこに移動します:
# cd # mkdir tmp # cd tmp
このディレクトリに loopback 環境を作成します:
# slc loopback
アプリケーションの名前と、そのアプリケーションの作成ディレクトリを聞かれます。ここでは両方とも myapp と指定しました:
すると必要なモジュールのインストールを含めた作業が始まり、完了すると myapp というディレクトリが作られます:
出来上がった myapp ディレクトリに移動して、モデルの定義を行います。以下のコマンドを入力します:
# cd myapp # slc loopback:model
ここからは API で CRUD を行うモデルとして、以下の様な item モデルを定義することにしましょう:
列名 | 列型 | 必須条件 |
---|---|---|
name | string | YES |
code | string | YES |
price | number |
実際にはこの定義に加え、自動的に id という列が定義されます。では最初に myapp アプリ内に item モデルを作成し、これらの3つの列を順に定義していきます。まず model name は "item" を入力します。次に data-source は、今回はデフォルトのメモリ DB を使うので "db (memory)" を選びます。またこのモデルは永続性(persistant)を有効にしたいので、その Base class には "PersistedModel" を指定してします。またこの item は REST API で公開したいので Expose するかどうかの質問には Yes を選択。この item モデルの複数形名にカスタムな名称を使うわけではない(普通に items とする)ので、Custom plural form の質問は空のままで Enter を押します。そしてこのモデルは common モデルにするので "common" を選択します:
次に各列を順に定義します。最初は name 列を定義します。名前には "name" を指定し、その type には "string" を、そして必須かどうかの属性は必須なので "Y" を入力します:
続けて "code" 列を定義します。同様にして名前には "code"、type には "string"、そして必須属性を "Y" で指定します:
最後に "price" 列を定義します。名前には "price"、type には "number" 、必須属性を "N" で指定します:
これで全ての列を指定し終わったので、最後に名前欄を空欄にして Enter を押します。これでモデルの定義が完了です:
ここまでの作業ができたら、カレントディレクトリで node.js を起動します:
# node .
すると、デフォルトでは 3000 番ポートで node.js が待受る形で起動します:
この状態で表示されているアドレス(http://(strongloopをインストールしたホスト名):3000/explorer)にブラウザでアクセスしてみると、作成した myapp アプリケーション内に定義されている API の一覧が表示され、その中には item モデルについても含まれているはずです:
item と書かれた箇所をクリックすると展開され、この item モデル向けに用意されている API の一覧が表示されます。特に何もしなくても item モデルの定義をしただけで一通りの CRUD 操作ができるような API が準備されていることがわかります:
用意された API はこの画面から実際に動かして試してみることもできます。例えば一番上にある /items への GET を実行してみましょう。このエントリの /items を書かれた箇所をクリックして開くと、この GET リクエスト API に関する情報が表示されます:
この画面内の "Try it out" と書かれたボタンをクリックすると実際に API を発行することができます。実際にクリックすると curl で実行されたコマンドや実際にリクエストされた API の URL などが確認できます。また Response Body には実行結果が表示されます。この例では実行結果は [] と、空の配列になっているので、実行しても何も得られなかった、ということになります(今はまだ中身がないのでこれで正しい実行結果です):
では実際に item レコードを作ってみましょう。レコードを作成するには POST リクエストを実行することになるので、/items への POST エントリを開き、Parameters 欄の data の部分に以下のようなフォーマットの JSON データを入力して "Try it out!" ボタンをクリックします( "id" は自動割り振りされるので、指定してあってもいなくても構いません。また実際に指定するデータは適当で構いません):
{ "name": "アディゼロ匠 B22875", "code": "4055339759613", "price": 12050, "id": 0 }
問題なく処理が成功すると、以下の様な結果が得られます。Response Code が 200 になっていれば成功を意味しており、Response Body には以下の様な JSON が返されます("id" の値として 0 を指定していましたが、自動割り振りされた結果の 1 が付与されています)。このデータが正しく追加された、ということになります:
{ "name": "アディゼロ匠 B22875", "code": "4055339759613", "price": 12050, "id": 1 }
データが正しく追加されたので、改めて再度 /items の GET を実行すると、今度は Response Body の結果は [] ではなく、先程入力したデータが含まれた配列になっているはずです。モデルを定義しただけで自動生成された CRUD の API が( /items の GET と POST だけですが)正しく動いていることが確認できました:
RDB のテーブルに相当するレコードを定義すれば、(コードを書くこともなく)即 CRUD API が用意される、という意味では便利です。
いずれはモニタリングやトレーシングなどもできる StrongLoop Arc についても勉強して、ここで紹介するつもりです。
コメント