JSON-Server 是一個 Node 模塊,運行 Express 服務器,你能夠指定一個 json 文件做爲 api 的數據源。git
npm install -g json-server
json-server
能夠直接把一個json
文件託管成一個具有全RESTful
風格的API
,並支持跨域、jsonp
、路由訂製、數據快照保存等功能的 web 服務器。github
db.json文件的內容:web
{ "course": [ { "id": 1000, "course_name": "馬連白米且", "autor": "袁明", "college": "金並即總變史", "category_Id": 2 }, { "id": 1001, "course_name": "公拉農題隊始果動", "autor": "高麗", "college": "先了隊叫及便", "category_Id": 2 } } }
例如如下命令,把db.json
文件託管成一個 web 服務。express
$ json-server --watch --port 53000 db.json
輸出相似如下內容,說明啓動成功。npm
\{^_^}/ hi! Loading db.json Done Resources http://localhost:53000/course Home http://localhost:53000 Type s + enter at any time to create a snapshot of the database Watching...
此時,你能夠打開你的瀏覽器,而後輸入:http://localhost:53000/coursejson
語法:json-server [options] <source>
api
選項列表:跨域
參數 | 簡寫 | 默認值 | 說明 |
---|---|---|---|
--config | -c | 指定配置文件 | [默認值: "json-server.json"] |
--port | -p | 設置端口 [默認值: 3000] | Number |
--host | -H | 設置域 [默認值: "0.0.0.0"] | String |
--watch | -w | Watch file(s) | 是否監聽 |
--routes | -r | 指定自定義路由 | |
--middlewares | -m | 指定中間件 files | [數組] |
--static | -s | Set static files directory | 靜態目錄,類比:express的靜態目錄 |
--readonly | --ro | Allow only GET requests [布爾] | |
--nocors | --nc | Disable Cross-Origin Resource Sharing [布爾] | |
--no | gzip | , --ng Disable GZIP Content-Encoding [布爾] | |
--snapshots | -S | Set snapshots directory [默認值: "."] | |
--delay | -d | Add delay to responses (ms) | |
--id | -i | Set database id property (e.g. _id) [默認值: "id"] | |
--foreignKeySuffix | -- | fks Set foreign key suffix (e.g. _id as in post_id) | [默認值: "Id"] |
--help | -h | 顯示幫助信息 | [布爾] |
--version | -v | 顯示版本號 | [布爾] |
$ json-server --watch -c ./jsonserver.json $ json-server --watch app.js $ json-server db.json json-server --watch -port 8888 db.json
例如啓動json-server的命令:json-server --watch app.js
是把一個js文件返回的數據託管成web服務。數組
app.js配合mockjs庫能夠很方便的進行生成模擬數據。瀏覽器
// 用mockjs模擬生成數據 var Mock = require('mockjs'); module.exports = () => { // 使用 Mock var data = Mock.mock({ 'course|227': [ { // 屬性 id 是一個自增數,起始值爲 1,每次增 1 'id|+1': 1000, course_name: '@ctitle(5,10)', autor: '@cname', college: '@ctitle(6)', 'category_Id|1-6': 1 } ], 'course_category|6': [ { "id|+1": 1, "pid": -1, cName: '@ctitle(4)' } ] }); // 返回的data會做爲json-server的數據 return data; };
json-server
爲提供了GET
,POST
, PUT
, PATCH
,DELETE
等請求的API,分別對應數據中的全部類型的實體。
# 獲取全部的課程信息 GET /course # 獲取id=1001的課程信息 GET /course/1001 # 添加課程信息,請求body中必須包含course的屬性數據,json-server自動保存。 POST /course # 修改課程,請求body中必須包含course的屬性數據 PUT /course/1 PATCH /course/1 # 刪除課程信息 DELETE /course/1 # 獲取具體課程信息id=1001 GET /course/1001
固然你能夠自定義路由:
$ json-server --watch --routes route.json db.json
route.json
文件
{ "/api/*": "/$1", // /api/course <==> /course "/:resource/:id/show": "/:resource/:id", "/posts/:category": "/posts?category=:category", "/articles\\?id=:id": "/posts/:id" }
經過命令行配置路由、數據文件、監控等會讓命令變的很長,並且容易敲錯,能夠把命令寫到npm的scripts中,可是依然配置不方便。
json-server容許咱們把全部的配置放到一個配置文件中,這個配置文件默認json-server.json
;
例如:
{ "port": 53000, "watch": true, "static": "./public", "read-only": false, "no-cors": false, "no-gzip": false, "routes": "route.json" }
使用配置文件啓動json-server:
# 默認使用:json-server.json配置文件 $ json-server --watch app.js # 指定配置文件 $ json-server --watch -c jserver.json db.json
查詢數據,能夠額外提供
GET /posts?title=json-server&author=typicode GET /posts?id=1&id=2 # 能夠用 . 訪問更深層的屬性。 GET /comments?author.name=typicode
還能夠使用一些判斷條件做爲過濾查詢的輔助。
GET /posts?views_gte=10&views_lte=20
能夠用的拼接條件爲:
_gte
: 大於等於_lte
: 小於等於_ne
: 不等於_like
: 包含GET /posts?id_ne=1 GET /posts?id_lte=100 GET /posts?title_like=server
默認後臺處理分頁參數爲: _page
第幾頁, _limit
一頁多少條。
GET /posts?_page=7 GET /posts?_page=7&_limit=20
默認一頁10條。
後臺會返回總條數,總條數的數據在響應頭:X-Total-Count
中。
_sort
設定排序的字段_order
設定排序的方式(默認升序)GET /posts?_sort=views&_order=asc GET /posts/1/comments?_sort=votes&_order=asc
支持多個字段排序:
GET /posts?_sort=user,views&_order=desc,asc
GET /posts?_start=20&_end=30 GET /posts/1/comments?_start=20&_end=30 GET /posts/1/comments?_start=20&_limit=10
能夠經過q
參數進行全文檢索,例如:GET /posts?q=internet
包含children的對象, 添加_embed
GET /posts?_embed=comments GET /posts/1?_embed=comments
包含 parent 的對象, 添加_expand
GET /comments?_expand=post GET /comments/1?_expand=post
json-server
自己就是依賴express開發而來,能夠進行深度定製。細節就不展開,具體詳情請參考官網。
const jsonServer = require('json-server') const server = jsonServer.create() const router = jsonServer.router('db.json') const middlewares = jsonServer.defaults() server.use(middlewares) server.get('/echo', (req, res) => { res.jsonp(req.query) }) server.use(jsonServer.bodyParser) server.use((req, res, next) => { if (req.method === 'POST') { req.body.createdAt = Date.now() } next() }) server.use(router) server.listen(3000, () => { console.log('JSON Server is running') })
router.render = (req, res) => { res.jsonp({ body: res.locals.data }) }
const jsonServer = require('json-server') const server = jsonServer.create() const router = jsonServer.router('db.json') const middlewares = jsonServer.defaults() server.use(middlewares) server.use((req, res, next) => { if (isAuthorized(req)) { // add your authorization logic here next() // continue to JSON Server router } else { res.sendStatus(401) } }) server.use(router) server.listen(3000, () => { console.log('JSON Server is running') })