JSON Server(Mock)メモ

Qiitaで検索しても、いまいち、どれがどれなんだ!?という感じですが、JSON Serverで、ローカル用のモックサーバーを立ち上げる際、db.jsonと連携させるのに苦心したので、メモ

修正前

server.js

server.get('/api/check', (req, res) => {
  const p = {
    registered: false,
    expired: false,
  }
  switch (req.query.username) {
    case 'hogehoge': // ユーザーA
      p.registered = true
      break
    case 'hogeeee': // ユーザーB
      p.registered = true
      p.expired = true
      break
    default:
      break
  }
  res.jsonp(p)
})

db.json(この時点では使用していません)

{
  "list": [
    {
      "name": "hogehoge",
    },
    {
      "name": "hogeeee",
    },
  ]
}

コードはザックリ簡略化しています。
usernameの値によって、値を変える的なコードです

PR出したら「ローカルでしか動かないモックだけどハードコーディングすんな」とのことだったので、db.jsonに値を追加して、ゴニョゴニョする。と・・・。いや面倒くさいん

修正方針

db.jsonに値を追加して、(リクエスト者が持っている、ユーザーリストを参照して、値があったら値を返して、)db.jsonに該当するユーザーの値がなかったら、デフォルトの値を返す

修正後

server.js

const router = jsonServer.router('db.json')

server.get('/api/check', (req, res) => {
  const p = {
    registered: false,
    expired: false,
  }

  const list = router.db
    .get('list')
    .find((o) => o.name === req.query.username)
    .value()
  if (list) {
    p.registered = list.registered
    p.expired = list.expired
  }
  res.jsonp(p)
})

db.json

{
  "list": [
    {
      "name": "hogehoge",
      "registered": "true",
      "expired": "false",
    },
    {
      "name": "hogeeee",
      "registered": "true",
      "expired": "true",
    },
  ]
}

ざっくり、こんな感じ。

router.db.get('list’) で、db.jsonの中からlistを取得し、あとはいつも通りfindで絞り込んで、代入する。もしdb.jsonの中身を、不要な値は入れないようにした場合は、存在チェックを入れる