ae-biu
Version:
Born For AE, Born To Do
82 lines (65 loc) • 1.94 kB
JavaScript
import jsonServer from 'json-server'
import fs from 'fs'
import path from 'path'
import { parse } from 'filter-string'
import { mockDir } from '../utils/paths'
import logger from '../utils/logger'
const createServer = () => {
// server
const server = jsonServer.create()
// db path
const dbPath = path.resolve(mockDir, 'db.json')
if (!fs.existsSync(dbPath)) {
logger.error('No db.json found in project, please see docs\n')
process.exit(1)
}
const router = jsonServer.router(dbPath)
const middlewares = jsonServer.defaults()
// transform req query, such as $offset -> _page, $limit -> _limit
const reqTransformMiddleware = (req, res, next) => {
// $limit
if (req.query.$limit) {
req.query._limit = req.query.$limit
}
// $offset
if (req.query.$offset) {
const limit = req.query._limit || 10
// req.query['_page'] = Math.floor(req.query['$offset'] / limit) + 1
req.query._start = req.query.$offset
req.query._limit = limit
}
// ops
const filters = parse(req.query.$filter)
filters.forEach(({ key, op, value }) => {
if (op === 'like') {
req.query[`${key}_like`] = value
}
if (op === 'gt' || op === 'ge' || op === 'le' || op === 'lt') {
req.query[`${key}_${op[0] + 'te'}`] = value
}
if (op === 'ne') {
req.query[`${key}_ne`] = value
}
if (op === 'eq') {
req.query[key] = value
}
})
// sort, only support one field
if (req.query.$orderby) {
const orderby = req.query.$orderby
const key = orderby.split(' ')[0]
const order = orderby.split(' ') || 'asc'
req.query._sort = key
req.query._order = order
}
next()
}
// apply transform
server.use(reqTransformMiddleware)
// apply defaults
server.use(middlewares)
// apply router
server.use(router)
return server
}
export default createServer