1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Node.js】json-server導入【Mock API】

Posted at

概要

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

リクエストメソッドPATCHhttp://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だけの状態よりはかなり見やすくなります
最後にサンプル用に作成したリポジトリを置いておきます

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?