JavaScript
Node.js

Expressを使ってローカルでのAPIテスト環境をサクッと作るための備忘録

JSONを返してくれるだけのREST APIを想定して何か作る時によくやるので、備忘録程度に書いておきます。
(「サクッと」には個人差・routing設定の複雑さによって誤差が生じます。ご了承ください。)

こんな人ならさくっと書きやすい

  • JSはわかるけど、APIの設定とかルーティングとかはRailsのをみたことあるなーくらいの人
  • Node.jsを知っている人

Expressとは

Express
Node.js上で動作するフレームワークです。
HTTPサーバーとして使ったりAPIのルーティング設定したりなど、使われる用途は幅広(印象)です。

API仕様

## END_POINT
http://localhost:4000/api/v1

## GET: /members
全メンバーデータを取得

## GET: /members/:id
idに対応したメンバーを取得

ディレクトリ作成+npm init

まずは

mkdir api-test
cd api-test
yarn init

Enter押しまくり(-yとかで全部yesでできたかも)

npm modulesを追加

元のJSONデータから整形したものを渡す想定で、 lodashread-config を入れています。

yarn add express lodash read-config -D

index.js作成

const express = require("express")
const lodash = require("lodash")
const readConfig = require("read-config")

const router = express()

const rawData = readConfig("./data/members.json")

const END_POINT = '/api/v1'

router.use(setJSON)

// responseのcontentTypeは全部JSONでいいのでmiddlewareで設定しておく
function setJSON(req, res, next) {
  res.contentType("application/json")
  next()
}

// idに対応したメンバーを取得
router.get(`${END_POINT}/members/:id`, (req, res, next) => {
  console.log(`get id ${req.params.id} data`)
  const data = _.filter(rawData, (i, elm) => Number(elm.id) === req.params.id)
  res.send(data)
})

// 全メンバーデータを取得
router.get(`${END_POINT}/members`, (req, res, next) => {
  console.log("get all data")
  const data = rawData
  res.send(data)
})

よくやるルーティング設定の方法

URLの文字列を値として使う

ルーティングパスに :id のようにコロンをつけると、 req.params{id: 数字} が格納されます。

router.get(`${END_POINT}/members/:id`, (req, res, next) => {
  console.log(req.params) // {id: '1'}
})

GETなどのクエリパラメーターを使う

req.query に入ってます。

router.get(`${END_POINT}/members`, (req, res, next) => {
  console.log(req.query) // {name: 'taro'}
})

同階層でも、数値のときと文字列のときでルーティングを変える

req.params で設定されてる変数は、正規表現によって範囲が制限できます。

// 数字
router.get(`${END_POINT}/members/:id(//d+)`, (req, res, next) => {
  console.log(req.params) // {id: '1'}
})

// 任意の文字列
router.get(`${END_POINT}/members/:name([a-zA-Z]+[a-zA-Z0-9])`, (req, res, next) => {
  console.log(req.params) // {name: 'taro'}
})

また、ルーティングの設定は書いたものが早いほど優先される(要確認)ので、404などを表示したい場合は一番下に書くとよさそうです。