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データから整形したものを渡す想定で、 lodash
と read-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などを表示したい場合は一番下に書くとよさそうです。