Get a full fake API as soon as possible. Base on NodeJS + JSON Server + Socket.IO.
Features:
-
Define your own database using a json file, generate REST APIs from that database.
-
Register user with username & password or email & password. Using object
users
in the database. -
Login with registered users.
-
Protect resources using JWT Bearer authentication.
-
Upload files.
-
Send and receive messages over web socket connection (Socket.IO).
Preview: https://nodejs-fake-api.herokuapp.com
git clone https://github.com/robinhuy/fake-api-nodejs.git
or fork to your account and clone the forked repo
cd fake-api-nodejs
npm install
or if you using yarn
cd fake-api-nodejs
yarn install
-
Production mode:
npm start
or
yarn start
-
Development mode (auto reload server when editing using nodemon):
npm run dev
or
yarn dev
-
The server will run on
http://localhost:8000
. You can test with public endpoint:http://localhost:8000/products
(GET method).
All the data was placed in database.json
. Edit it to suit your purpose but keep object users
to use authentication feature.
You can use https://mockaroo.com/ to mock data, and publish your code to https://heroku.com/ or similar hosting to get a Public API.
Note:
-
To protect resources, decleare resources and protected methods in
database.json
:"protectedResources": { "users": ["GET", "POST", "PUT", "PATCH", "DELETE"], "products": ["POST", "PUT", "PATCH", "DELETE"] }
-
To register new user, using endpoint
/register
, methodPOST
, request typeapplication/json
. Body request likeusers
resources: -
To login, using endpoint
/login
, methodPOST
, request typeapplication/json
. Body request like this:{ "username": "admin", "password": "admin" }
or
{ "email": "[email protected]", "password": "admin" }
-
To renew AccessToken, using endpoint
/renew-token
, methodPOST
, request typeapplication/json
. Body request like this:{ "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjEsImlhdCI6MTY1NjMyNzE4NiwiZXhwIjoxNjU2MzI4MDg2fQ.-si1n7yHpjQ2LEyYqZT6ClIFJOqLOeVXRhwjzyvEZMo" }
-
To upload single file, using endpoint
/upload-file
, methodPOST
, request typeform-data
, fieldfile
. Uploaded file stored in/public/uploads/
. -
To upload multiple files, using endpoint
/upload-files
, methodPOST
, request typeform-data
, fieldfiles
. Uploaded files stored in/public/uploads/
. -
Change default port, database file, jwt secret or jwt token expires in
config.js
.
Please view detailed document in https://github.com/typicode/json-server/blob/master/README.md#table-of-contents
If you want to change logic of authentication or add more custom REST endpoints, please edit file server.js
and src/rest.js
.
Edit src/socket-io.js
to add or modify Socket.IO events, src/graphql.js
to add or modify GraphQL query/mutation (currently, authentication aren't being applied to Socket.IO & GraphQl endpoints).
View and modify resources in database.json
.
Open endpoints do not require Authentication.
-
Login: POST /login
-
Register: POST /register
-
Get products: GET /products
-
Get product by ID: GET /products/:id
-
Upload single file: POST /upload-file
-
Upload multiple files: POST /upload-files
Private endpoints require a valid Token to be included in the header of the request. A Token can be acquired from the Login view above.
-
Get users: GET /users
-
Get user by ID: GET /users/:id
-
Create user: POST /users
-
Update user (entire information): PUT /users/:id
-
Update user (partial information) PATCH /users/:id
-
Create product: POST /products
-
Update product (entire information): PUT /products/:id
-
Update product (partial information) PATCH /products/:id
-
Event
emit
: Echo message to sendersocket.emit("emit", "Hello");
-
Event
broadcast
: Broadcast message to all clients in the current namespace except the sendersocket.emit("broadcast", "Hello");
-
Event
broadcast-all
: Broadcast message to all clients in the current namespace include the sendersocket.emit("broadcast-all", "Hello");
-
Event
join-room
: Join a roomsocket.emit("join-room", "game");
-
Event
emit-in-room
: Send message to all clients in the room except the sendersocket.emit("join-room", { room: "game", event: "chat", msg: "Hello" });
-
Endpoint:
/graphql
. -
Get objects by name (objects declared in database.json)
query getData($objectName: String!) { getObjects(objectName: $objectName) }
Query variables:
{ "objectName": "products" }
-
Get an object by name, search by property
query getData($objectName: String!, $objectKey: String!, $objectValue: ObjectValue) { getObjectByKey(objectName: $objectName, objectKey: $objectKey, objectValue: $objectValue) }
ObjectValue must specify the data type:
ObjectValue { int: Int float: Float string: String boolean: Boolean }
Query variable examples:
{ "objectName": "products", "objectKey": "id", "objectValue": { "int": 1 } }
{ "objectName": "products", "objectKey": "name", "objectValue": { "string": "Grapes - Black" } }
-
Create an object
query CreateObject($objectName: String!, $objectData: JSONScalarType!) { createObject(objectName: $objectName, objectData: $objectData) }
Query variable examples:
{ "objectName": "posts", "objectData": { "title": "New post" } }
-
Update an object
query UpdateObject($objectName: String!, $objectId: ID!, $objectData: JSONScalarType!) { updateObject(objectName: $objectName, objectId: $objectId, objectData: $objectData) }
Query variable examples:
{ "objectName": "posts", "objectId": "1", "objectData": { "title": "Update post" } }
-
Delete an object
query DeleteObject($objectName: String!, $objectId: ID!) { deleteObject(objectName: $objectName, objectId: $objectId) }
Query variable examples:
{ "objectName": "posts", "objectId": "1" }
...