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