概要
APIのモック用にjson-serverを導入したので主な処理をざっくりとまとめた
json-serverについて
簡単にモックAPIを作成できるnodeのライブラリ
主にテスト作成時に使われるもの
導入
$ yarn add json-server
または
$ npm install –save-dev json-server
実際に使ってみる
次の内容のmock.json
を作成する
{
"test": {
"id": "mock_id",
"text": "mock json desu"
}
}
ターミナルで次のコマンドを実行
$ json-server mock.json
リクエストメソッドGET
、エンドポイントhttp://localhost:3000/test
を叩くと次の内容のレスポンスを取得できる
{
"id": "mock_id",
"text": "mock json desu"
}
解説
mock.json
の第一階層のキー名がそのままエンドポイントになる
例えば次のようにmock.json
を作成すればエンドポイントが/test
と/sample
のAPIのモックを作れる
{
"test": {
"id": "mock_id_1",
"text": "mock json test"
},
"sample": {
"id": "mock_id_2",
"text": "mock json sample"
}
}
リクエストメソッドは全てGET
になる(仕様)
portの指定がなければ3000
が割り振られる
オプションについて
-m {{ jsファイルのパス }}
APIモックが叩かれたらデータを取得する前に指定したjsファイルを実行してくれる
GET
以外のリクエストメソッドのAPIのモックを作成したい時やトークンでの認証をする時などに使う
例
mock.json
{
"test": {
"id": "mock_id_1",
"text": "mock json test"
},
"test_patch": {}
}
次の内容のmiddleware.js
を作成
module.exports = async function (req, _res, next) {
// リクエストメソッドが PATCH の場合、リクエストURLに _patch をつけ、リクエストメソッドを GET に直す
if (req.method === 'PATCH') {
req.method = 'GET'
req.url += '_patch'
}
next()
}
ターミナルで次のコマンドを実行
$ json-server mock.json -m middleware.js
リクエストメソッドPATCH
、http://localhost:3000/test
を叩くと次のレスポンスを取得する
{}
--routes {{ jsonファイルのパス }}
エンドポイントが/test/sample
のような形になる場合やエンドポイントにクエリパラメータが含まれる場合に使う
例
mock.json
{
"mock_1": {
"id": "mock_id_1",
"text": "mock json test"
}
}
次の内容のroutes.json
を作成
{
"/test/sample": "/mock_1"
}
ターミナルで次のコマンドを実行
$ json-server mock.json --routes routes.json
http://localhost:3000/test/sample
を叩くと次のレスポンスを取得する
{
"id": "mock_id_1",
"text": "mock json test"
}
--host {{ host名 }}
, -p {{ port番号 }}
ホスト名とポート番号を指定できる
おまけ
モックの数が増えるとmock.json
の中身が煩雑になってくると思います
それの対策として他のファイルでjsonを作成して立ち上げ時にmock.json
にまとめるという形にしました
次の内容のjsファイルを用意
const fs = require('fs')
const path = require('path')
const root = path.resolve('./', 'mocks')
const api = fs.readdirSync(root).reduce((api, file) => {
// ファイル名を取得
const endpoint = path.basename(file, path.extname(file))
// ファイル名をキー名にする
api[endpoint] = JSON.parse(fs.readFileSync(root + '/' + file, 'utf-8'))
return api
}, {})
// 作成したjsonをmock.jsonに書き込む
fs.writeFile('./mock.json', JSON.stringify(api), err => {
if (err) throw err
})
mocksフォルダを作成し、その中にファイル名がパスになるjsonファイルを作成する
エンドポイントごとにファイルを分けられるのでmock.json
だけの状態よりはかなり見やすくなります
最後にサンプル用に作成したリポジトリを置いておきます