アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

サクッとAPIが必要な時はLoopBackが便利

ohataです

今年もいよいよあと数日で終わりですね。 平成最後の紅白とか、平成最後ネタが盛り上がりそうですね。 個人的には年号変わる瞬間にJUMPして、[●!●!JUMP!]を狙う人が増えるといいなと思っています。 そんなわけで、平成最後の12/28ブログです

LoopBackについて

Express ベースのREST APIのフレームワークです

https://loopback.io/

StrongLoop というものを、IBMが買収して提供しています。 Expressベースなので抵抗感がだいぶないです

インストール

LoopBackのGetting started とほぼ一緒ですがインストールをしていきます

$ npm install -g loopback-cli

プロジェクトの作成

$ lb

コマンドを叩くと、対話形式で必要な情報を聞かれるので、答えていきます
(日本語で聞かれると何か、子供扱いされているような気もしますが。。。)

|? アプリケーションの名前は何ですか? sample-api
|? プロジェクトを格納するディレクトリーの名前を入力してください: sample-api
|? どのバージョンの LoopBack を使用しますか? 3.x (Active Long Term Support)
|? どのようなタイプのアプリケーションにしますか? api-server (ローカル・ユーザー認証を持つ LoopBack API サーバー)

対話が終了したら、プロジェクトディレクトが作成されるので、そちらに移動します

$ cd sample-api/

modelの作成

提供したい情報をmodel で管理するために modelを作成します。
モデル名とテーブル名が一致していた方が楽ですが、model : personで作成するとテーブルもpersonと関連するので、そこの定義がちょっと違和感あるかもしれません (people テーブルと関連させたい)

$ lb model

こちらも対話形式で作っていきます

|? モデル名を入力してください: person
|? person を付加するデータ・ソースを選択してください: db (memory) #とりあえずmemory
|? モデルの基本クラスを選択します PersistedModel
|? REST API を介して person を公開しますか? Yes
|? カスタム複数形 (REST URL の作成に使用します):
|? 共通モデルですか、あるいはサーバー専用ですか? 共通
では、person プロパティーをいくつか追加しましょう。

完了したら、空のプロパティー名を入力してください。
|? プロパティー名: name
|? プロパティー・タイプ: string
|? 必須 Yes
|? デフォルト値 [なしの場合は空白のまま]:

これでperson 情報にAPIでアクセスする準備が出来ました。

画面での確認

サービスを起動します

node .

開発モードではswaggerで確認できるので、確認も楽です

http://localhost:3000/explorer/

f:id:k-ohata:20181228104719p:plain

データの登録

まだ何も登録されていない状態なので、データ登録を行います せっかくなので swaggerから [POST] で作成します

f:id:k-ohata:20181228114317p:plain

データの確認

ブラウザからアクセスすると、登録したデータがJSONで返ってきました。

f:id:k-ohata:20181228113757p:plain

mysqlに変更

ただ、このままだとメモリーに状態が乗っているだけなので、 サーバーを落とすとデータが消えてしまいます。

そこで、情報自体をmysqlに保存していきます。

DBの準備

migration機能もあるが今回は動作確認のみなので、また後日 m(__)m データベースと[person]テーブルを作成します

$ mysql -uroot
mysql> create database sample_api;
mysql> use sample_api;
mysql> create table person (id integer NOT NULL AUTO_INCREMENT, name text NOT NULL, email text NOT NULL, PRIMARY KEY(id));

datasourceの追加

mysqlの設定情報を追加します。

$ lb datasource

server/datasources.json に設定が追加されます

{
  "db": {
    "name": "db",
    "connector": "memory"
  },
  "sample-api": {
    "host": "localhost",
    "port": 3306,
    "url": "",
    "database": "sample_api",
    "password": "",
    "name": "sample-api",
    "user": "root",
    "connector": "mysql"
  }
}

person モデルをmysqlと紐づける

server/model-config.json の dataSourceを[sample-api]に変更します

"person": {
  "dataSource": "sample-api",
  "public": true
}

ここまで準備が出来たら、サーバーを再起動して、先ほどと同じように POST処理を行います。

DBに登録されているか確認します

$ mysql -uroot sample_api
mysql> select * from person;
+----+------+------------------+
| id | name | email            |
+----+------+------------------+
|  1 | hoge | hoge@example.com |
+----+------+------------------+

mysqlで接続出来ない事象がでたら

検証中に 以下のようなエラーが出ました (他のマシンでは出なかった)

接続失敗: Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client

上記エラーが出た場合は、こちらを使ってみてください
(高速らしいので、初めからこちらでも良いと思います)

npm i --save mysql2

server/datasources.jsonのconnectorを書き換える

"sample-api": {
  ・・・ 
  "connector": "mysql2"
}

まとめ

すごい初歩歴なところですが、既存データをモックで使いたい時など簡単に設定できるので楽だと思います。 もちろん実務レベルで使うにも使いやすく、DBのrelationsはもちろん、AccessTokenの処理も簡単に設定(これできるのは有難い)できるのでとても便利です。 (次回機会があれば投稿しようと思います) Expressベースなので、学習コストが低いのも嬉しい!

それでは、良いお年を!!