/json-server

Get a full fake REST API with zero coding in less than 30 seconds (seriously)

Primary LanguageJavaScriptMIT LicenseMIT

JSON Server

Get a full fake REST API with zero coding in less than 30 seconds (seriously)

Created with <3 for front-end developers who need a quick back-end for prototyping and mocking.

See also hotel, a simple server manager.

Example

Create a db.json file

{
  "posts": [
    { "id": 1, "title": "json-server", "author": "typicode" }
  ],
  "comments": [
    { "id": 1, "body": "some comment", "postId": 1 }
  ]
}

Start JSON Server

$ json-server --watch db.json

Now if you go to http://localhost:3000/posts/1, you'll get

{ "id": 1, "title": "json-server", "author": "typicode" }

Also, if you make POST, PUT, PATCH or DELETE requests, changes will be automatically and safely saved to db.json using lowdb.

Routes

Based on the previous db.json file, here are all the default routes. You can also add other routes using --routes.

GET    /posts
GET    /posts/1
GET    /posts/1/comments
GET    /posts?title=json-server&author=typicode
POST   /posts
PUT    /posts/1
PATCH  /posts/1
DELETE /posts/1

To slice resources, add _start and _end or _limit (an X-Total-Count header is included in the response).

GET /posts?_start=20&_end=30
GET /posts/1/comments?_start=20&_end=30

To sort resources, add _sort and _order (ascending order by default).

GET /posts?_sort=views&_order=DESC
GET /posts/1/comments?_sort=votes&_order=ASC

To make a full-text search on resources, add q.

GET /posts?q=internet

To embed other resources, add _embed.

GET /posts/1?_embed=comments

Returns database.

GET /db

Returns default index file or serves ./public directory.

GET /

Install

$ npm install -g json-server

Extras

Static file server

You can use JSON Server to serve your HTML, JS and CSS, simply create a ./public directory.

mkdir public
echo 'hello word' > public/index.html
json-server db.json

Access from anywhere

You can access your fake API from anywhere using CORS and JSONP.

Remote schema

You can load remote schemas.

$ json-server http://example.com/file.json
$ json-server http://jsonplaceholder.typicode.com/db

JS file support

You can create data programmatically.

Tip use modules like faker or casual.

// index.js
module.exports = function() {
  var data = { users: [] }
  // Create 1000 users
  for (var i = 0; i < 1000; i++) {
    data.users.push({ id: i, name: 'user' + i })
  }
  return data
}
$ json-server index.js

Add routes

Create a routes.json file.

{
  "/api/": "/",
  "/blog/:resource/:id/show": "/:resource/:id"
}

Start JSON Server with --routes option.

json-server db.json --routes routes.json

Now you can access resources using additional routes.

/api/posts
/api/posts/1
/blog/posts/1/show

Module

If you need to add authentication, validation, you can use the project as a module in combination with other Express middlewares.

var jsonServer = require('json-server')

// Returns an Express server
var server = jsonServer.create()

// Set default middlewares (logger, static, cors and no-cache)
server.use(jsonServer.defaults)

// Returns an Express router
var router = jsonServer.router('db.json')
server.use(router)

server.listen(3000)

For an in-memory database, you can pass an object to jsonServer.router(). Please note also that jsonServer.router() can be used in existing Express projects.

To modify responses, use router.render():

// In this example, returned resources will be wrapped in a body property
router.render = function (req, res) {
  res.jsonp({
   body: res.locals.data
  }) 
}

To add rewrite rules, use jsonServer.rewriter():

// Add this before server.use(router)
server.use(jsonServer.rewriter({
  '/api/': '/',
  '/blog/:resource/:id/show: '/:resource/:id'
})

Alternatively, you can also mount the router on another path.

server.use('/api', router)

Deployment

You can deploy JSON Server. For example, JSONPlaceholder is an online fake API powered by JSON Server and running on Heroku.

Links

Video

Articles

Projects

License

MIT - Typicode