JSONを返すREST APIサーバーを簡単に構築出来る コマンドラインツール「json-server」の紹介です。
プログラミング言語やプロジェクトを問わず、JSONオブジェクトを扱う機会は多いと思いますが、
その多くはサーバー上 ( データベースを通じて ) からJSONを取得( * CRUD含む )します。
( CRUD : Create Read Update Delete )
基本、CRUD処理はサーバーサイド側の開発している人が担当する事が多いと思いますが、
バックエンドの機能が完成していないと" フロントエンド側の作業が進められない "
ということも よくあります。
そういった開発の遅れが解消されそうなコマンドラインツールが「json-server
」です。
json-serverはコマンド一発で、JSONファイルからREST-APIサーバーを構築できます。
( GET, POST, PUT, PATCH, DELETE )
json-serverはnode.jsで開発されているパッケージなので、ターミナル上から
'npm
'コマンドを使ってインストールします。
# json-serverをインストール *環境によってはsudoが必要です
npm install -g json-server
# 正しくインストールされると'json-server'コマンドが使えるようになります
$ json-server -v
0.9.6
json-serverはJSONファイルのデータを読み込んでサーバーを構築するので、
静的なJSONファイルを準備する必要があります。
'db.json
'というファイル名で下記のオブジェクトを作成しました。
{
"posts": [
{ "id": 1, "title": "json-server", "author": "typicode" },
{ "id": 2, "title": "api-server", "author": "someone1" },
{ "id": 3, "title": "api-example", "author": "someone2" }
],
"comments": [
{ "id": 1, "body": "some comment", "postId": 1 }
],
"profile": { "name": "typicode" }
}
コマンドライン上から' json-server jsonファイル名
'でRESTサーバーが立ち上がります。
( デフォルトでは 'localhost:3000
' でサーバーが立ち上がります *プログラムからアクセスする場合は'127.0.0.1:3000
' )
# json-serverを起動
json-server db.json
# 起動するポートを変える場合
json-server db.json --port 3004
# --watchオプションを付けるとjsonファイルが変更されるとリスタートされます
json-server --watch db.json --port 3004
localhost:3000
' にアクセスした画面( '/db'にアクセスすると全てのJSONオブジェクトが返ってきます )

localhost:3000/key名
'でアクセスするとJSONが返ってきます 
上記の'db.json'だと オブジェクト数が少ないので気になりませんが、
URLにパラメータを与えることで取得するデータにフィルターを掛けたりすることが出来ます。
## 第二セグメントに数字を指定すると'id'のオブジェクトが返ってきます ##
http://localhost:3000/posts/1
## SQLのwhere文 相当のフィルタ ##
# jsonの'posts'内'id=1'のオブジェクトを取得
http://localhost:3000/posts?id=1
## SQLのLike文 相当のフィルタ ##
# 'posts'内'title'に'api'が含まれるオブジェクトを取得
http://localhost:3000/posts?title.api
## FullTextサーチ 相当のフィルタ ##
# オブジェクト全体で文字列が含まれる検索します
http://localhost:3000/posts?q=api
## SQLのOrderBy 相当のフィルタ ##
# '_sort'で並び替え '_order'で昇順、降順の指定
http://localhost:3000/posts?_sort=title&_order=DESC
## ページネーション ##
# デフォルトでは10件表示
http://localhost:3000/posts?_page=1 # ページ1
http://localhost:3000/posts?_page=1&_limit=20 # 20件に指定
上記は全てGETリクエストでの処理ですが、POST,PUT, PATCH, DELTE リクエストを送ると、
通常の処理のように、JSON内のオブジェクトを追加したり消去したり出来ます。
json-serverでJSONファイルからテスト用のRESTサーバーを立ち上げることは簡単に出来ましたが、
テスト用のデーターが無いと話しになりません。
手打ちでJSONファイルを作成するのも手間が掛かるので、' faker.json
'という
ダミーデータを生成するライブラリを使って、テスト用データを一括で作成するコードを作りました。
# faker.jsをインストール
npm install faker --save
下記のスニペットはJSONファイルを生成するコードです。
( * node.jsファイル )
コマンドライン上から実行すると
指定した件数のオブジェクト & ファイル名で JSONファイルが作成されます。
// jsonGenerate.js
const f = require("faker");
const fs = require("fs");
const EventEmitter = require("events");
/*--------------------
- ファンクション
---------------------*/
// jsonデータをファイルに書き込みする処理
function createJsonFile(fileName, json) {
return fs.writeFileSync(fileName, JSON.stringify(json), "utf8");
}
// jsのDateフォーマットからmysql-timeフォーマットに処理
function toMysqlDate(date) {
return new Date(date).toISOString().slice(0, 19).replace("T", " ");
}
/*--------------------
- イベント
---------------------*/
const myEvent = new EventEmitter();
// ユーザー作成イベントを定義
myEvent.on("generateJSON", (fileName, amount) => {
// fakerで使う言語を日本語にセット
f.locale = "ja";
// 元となるJSONスキーマ -- この例では'users'内にオブジェクトを追加します --
let jsonSchema = {
users: []
}; // ! jsonSchema
// jsonにデータを"amount"で指定した数を追加
for (let id = 1; id < amount + 1; id++) {
// jsonSchemaのusersにデータを追加 * faker.jsを使用 *
jsonSchema.users.push({
id: id,
user_name: f.internet.userName(),
name: f.name.lastName() + " " + f.name.firstName(),
email: f.internet.email(),
created_at: toMysqlDate(f.date.past()) // mysqlタイム フォーマットに変換
}); // ! .users.push()
} // ! for()
// createJsonFile関数の呼び出し
createJsonFile(fileName, jsonSchema);
if (fs.statSync(fileName)) {
// ファイルが作成された時に表示させるメッセージ
console.log(fileName + " has been generated!");
} // ! if()
}); // ! .on.("generateJSON")
/*--------------------
- 実行部分
---------------------*/
// この例ではユーザーデータを100件作成
// (イベント名, 発行するファイル名, 作成する件数)
myEvent.emit("generateJSON", "users.json", 100);
/* usage */
// node jsonGenerate.js
以上がjson-serverの紹介でした。
今回はコマンドラインツールを紹介しましたが、モジュールとして使うことも可能で、
authなどの認証やroutingを変更することも可能です。
テスト用のJSONを返すサーバーが必要な時にすぐに使うことが出来るので、
フロントエンドやスマホアプリ開発で役に立つ機会が多いと思われます。
気になった人はゼヒ×2 チェックしてください!
GitHub : typicode/json-server