function create() { return express().set('json spaces', 2); }
...
```sh
$ npm install json-server --save-dev
```
```js
// server.js
var jsonServer = require('json-server')
var server = jsonServer.create()
var router = jsonServer.router('db.json')
var middlewares = jsonServer.defaults()
server.use(middlewares)
server.use(router)
server.listen(3000, function () {
console.log('JSON Server is running')
...
defaults = function (opts) { var userDir = path.join(process.cwd(), 'public'); var defaultDir = path.join(__dirname, 'public'); var staticDir = fs.existsSync(userDir) ? userDir : defaultDir; opts = objectAssign({ logger: true, static: staticDir }, opts); var arr = []; // Compress all requests if (!opts.noGzip) { arr.push(compression()); } // Logger if (opts.logger) { arr.push(logger('dev', { skip: function skip(req) { return process.env.NODE_ENV === 'test' || req.path === '/favicon.ico'; } })); } // Enable CORS for all the requests, including static files if (!opts.noCors) { arr.push(cors({ origin: true, credentials: true })); } if (process.env.NODE_ENV === 'development') { // only use in development arr.push(errorhandler()); } // Serve static files arr.push(express.static(opts.static)); // No cache for IE // https://support.microsoft.com/en-us/kb/234067 arr.push(function (req, res, next) { res.header('Cache-Control', 'no-cache'); res.header('Pragma', 'no-cache'); res.header('Expires', '-1'); next(); }); // Read-only if (opts.readOnly) { arr.push(function (req, res, next) { if (req.method === 'GET') { next(); // Continue } else { res.sendStatus(403); // Forbidden } }); } return arr; }
...
```
```js
// server.js
var jsonServer = require('json-server')
var server = jsonServer.create()
var router = jsonServer.router('db.json')
var middlewares = jsonServer.defaults()
server.use(middlewares)
server.use(router)
server.listen(3000, function () {
console.log('JSON Server is running')
})
```
...
rewriter = function (routes) { var router = express.Router(); router.get('/__rules', function (req, res) { res.json(routes); }); Object.keys(routes).forEach(function (route) { if (route.indexOf(':') !== -1) { router.all(route, function (req, res, next) { // Rewrite target url using params var target = routes[route]; for (var param in req.params) { target = target.replace(':' + param, req.params[param]); } req.url = target; req.query = updateQueryString(req.query, req.url); next(); }); } else { router.all(route + '*', function (req, res, next) { // Rewrite url by replacing prefix req.url = req.url.replace(route, routes[route]); req.query = updateQueryString(req.query, req.url); next(); }); } }); return router; }
...
body: res.locals.data
})
}
```
#### Rewriter example
To add rewrite rules, use `jsonServer.rewriter()`:
```javascript
// Add this before server.use(router)
server.use(jsonServer.rewriter({
'/api/': '/',
'/blog/:resource/:id/show': '/:resource/:id'
}))
...
router = function (source) { // Create router var router = express.Router(); // Add middlewares router.use(methodOverride()); router.use(bodyParser); // Create database var db = void 0; if (_.isObject(source)) { db = low(); db.setState(source); } else { db = low(source, { storage: fileAsync }); } validateData(db.getState()); // Add lodash-id methods to db db._.mixin(lodashId); // Add specific mixins db._.mixin(mixins); // Expose database router.db = db; // Expose render router.render = function (req, res) { res.jsonp(res.locals.data); }; // GET /db router.get('/db', function (req, res) { res.jsonp(db.getState()); }); // Handle /:parent/:parentId/:resource router.use(nested()); // Create routes db.forEach(function (value, key) { if (_.isPlainObject(value)) { router.use('/' + key, singular(db, key)); return; } if (_.isArray(value)) { router.use('/' + key, plural(db, key)); return; } var msg = 'Type of "' + key + '" (' + (typeof value === 'undefined' ? 'undefined' : _typeof(value)) + ') ' + (_.isObject(source ) ? '' : 'in ' + source) + ' is not supported. ' + 'Use objects or arrays of objects.'; throw new Error(msg); }).value(); router.use(function (req, res) { if (!res.locals.data) { res.status(404); res.locals.data = {}; } router.render(req, res); }); router.use(function (err, req, res, next) { console.error(err.stack); res.status(500).send(err.stack); }); return router; }
...
$ npm install json-server --save-dev
```
```js
// server.js
var jsonServer = require('json-server')
var server = jsonServer.create()
var router = jsonServer.router('db.json')
var middlewares = jsonServer.defaults()
server.use(middlewares)
server.use(router)
server.listen(3000, function () {
console.log('JSON Server is running')
})
...
function jsonParser(req, res, next) { if (req._body) { debug('body already parsed') next() return } req.body = req.body || {} // skip requests without bodies if (!typeis.hasBody(req)) { debug('skip empty body') next() return } debug('content-type %j', req.headers['content-type']) // determine if request should be parsed if (!shouldParse(req)) { debug('skip parsing') next() return } // assert charset per RFC 7159 sec 8.1 var charset = getCharset(req) || 'utf-8' if (charset.substr(0, 4) !== 'utf-') { debug('invalid charset') next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { charset: charset })) return } // read read(req, res, next, parse, debug, { encoding: charset, inflate: inflate, limit: limit, verify: verify }) }
n/a
function urlencodedParser(req, res, next) { if (req._body) { debug('body already parsed') next() return } req.body = req.body || {} // skip requests without bodies if (!typeis.hasBody(req)) { debug('skip empty body') next() return } debug('content-type %j', req.headers['content-type']) // determine if request should be parsed if (!shouldParse(req)) { debug('skip parsing') next() return } // assert charset var charset = getCharset(req) || 'utf-8' if (charset !== 'utf-8') { debug('invalid charset') next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { charset: charset })) return } // read read(req, res, next, parse, debug, { debug: debug, encoding: charset, inflate: inflate, limit: limit, verify: verify }) }
n/a