Skip to content

Instantly share code, notes, and snippets.

@capJavert
Last active April 19, 2018 09:39
Show Gist options
  • Save capJavert/fbbad572000e36e715fe102594508c0c to your computer and use it in GitHub Desktop.
Save capJavert/fbbad572000e36e715fe102594508c0c to your computer and use it in GitHub Desktop.
Custom json server using https://github.com/typicode/json-server and enables custom pk assignment for resources.
const jsonServer = require('json-server');
const server = jsonServer.create();
const path = require('path');
const router = jsonServer.router(path.join(__dirname, 'db.json'));
const middlewares = jsonServer.defaults();
// define primary key columns for each resource
const primaryKeys = {
"countries": "code",
"towns": "id",
"access-policies": "accessPolicyId",
"device-services": "id"
};
const port = 3200;
server.use(middlewares);
server.use(router);
server.listen(port, () => {
console.log('Test server is running on port: ' + port)
});
router.render = (req, res) => {
const resource = req.path.split('/')[1];
let filteredResponse = res.locals.data;
// remapping internal id columns to dedicated resource columns
if (req.method === 'POST' || req.method === 'PUT') {
req.body.id = req.body[primaryKeys[resource]];
} else if (req.method === 'GET') {
filteredResponse = filterResponse(resource, res.locals.data);
}
// optional response wrapping to data attribute
res.jsonp({
data: filteredResponse
});
};
function filterResponse(resource, response) {
// don't filter if primaryKey is same as internal
if (primaryKeys[resource] === 'id') {
return response;
}
if (response instanceof Array) {
for (let i=0;i<response.length;i++) {
delete response[i].id;
}
} else {
delete response.id;
}
return response;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment