這是一篇推薦一個便捷的生成mock server的命令行工具的軟文,沒錯這麼牛逼的東西就是我寫的,不過推廣效果不佳,沒有使用過json-server的小夥伴基本就把我這篇文章略過了html
那掌握這個工具你能獲得什麼呢?只要你安裝了node只要你會建立文件夾和文件那麼你就能夠獲得一個mock server,而且這個mock server 能夠簡單的擁有任意路由,這樣你就不用在本身的業務代碼裏面mock 數據了前端
json-server-router
已經在趣店的前端團隊使用了一段時間了,事實證實仍是蠻有效果的,幹咱們這行最痛苦的事情莫過於修改別人的代碼,而作前端的不少時候可能要對別人的頁面作一些UI調整,而一個線上運行的項目業務邏輯每每很複雜,你可能連頁面都進不去更別提調整UI,也不能盲寫呀,每每造數據倆小時coding五分鐘,此時若是有完備的mock 數據上述問題將不復存在,json-server-router
的數據源就是普通的文件夾能夠伴隨項目的版本控制一直存能夠完美的解決上述問題node
json-server-router 的做用是提供一個簡明的方式構建出擁有任意的路由的 mock server
,json-server-router
是對json-server
的擴展因此要想更好的理解下面的內容必定要先了解json-server,json-server
是一個很牛逼的東西做爲一個前端開發你有必要了解一下git
在使用 json-server 時你寫了以下文件(db.json) 也就表明你獲得了四個 mock 接口 /update
,/retrieve
, /create
,/delete
可是實際的需求中接口路由確定不能這麼簡單你須要的多是 /aaa/bbb/ccc/update
這樣的形式,雖然json-server
能夠配置rewrite
能夠解決部分問題,可是這並不簡單,接下來咱們來看一下json-server-router
的方式github
// db.json
{
"update": { "code": 200, "message": "succeed", "data": true },
"retrieve": { "code": 200, "message": "succeed", "data": true },
"create": { "code": 200, "message": "succeed", "data": true },
"delete": { "code": 200, "message": "succeed", "data": true }
}
複製代碼
json-server-router 的實現理念是根據目錄結構,構建出想要的接口形式 假設咱們的目標接口爲 /aaa/bbb/ccc/update
那麼咱們只需構件出以下的目錄結構npm
當遇到名稱爲 index
的文件路徑拼接的時候會忽略index
,當碰見鍵值爲 index
路徑拼接一樣也會忽略index
json
- aaa
- bbb
+ ccc.json // 在ccc.json中添加 update
or
- aaa
- bbb
- ccc
+index.json // 在index.json中添加update
複製代碼
mock
爲 mock 文件的根目錄mock/books/index.json
-mock
+ index.json ------> /xxx
+ book.json ------> /book/xxx
- foo
+ index.json ------> /foo/xxx
+ bar.json ------> /foo/bar/xxx
複製代碼
/books/index.json
內容以下將對應生成四個接口 /books/
/books/retrieve
/books/create
/books/delete
bash
{
"index": { "code": 200, "message": "succeed", "data": true }, // /books/
"retrieve": { "code": 200, "message": "succeed", "data": true },// /books/retrieve
"create": { "code": 200, "message": "succeed", "data": true },// /books/create
"delete": { "code": 200, "message": "succeed", "data": true }// /books/delete
}
複製代碼
當前全局安裝以後你會獲得一個叫jsr
的全局命令,根據前面的介紹這時候其實你只需構件出一個包含mock files
的根目錄就足夠了cookie
$ npm install json-server-router -g
$ jsr --root mock
複製代碼
jsr [options]
Options Required:
--root, -r Paths to mock files parent dir [string] [required]
Options:
--config Path to JSON config file [string] [default:jsr.config.js]
--port, -p Set port [number] [default: 3000]
--host [string] [default: "local ip"]
--static Set static files directory(same as json-server) [string] [default: "public"]
--watch, -w Watch file(s) [boolean] [default: false]
--open, -o open [boolean] [default: false]
--middlewares, -m Paths to middleware files TODO [array]
--help, -h Show help [boolean]
--version, -v Show version number [boolean]
Examples:
jsr --root mock
jsr --root mock --port 3000
複製代碼
config
設置配置文件默認配置文件的地址是當前目錄的下的jsr.config.js
static
靜態資源的地址跟json-server
是一致的,須要注意的是若是 static
路徑存在的話json-server-router
會自動建立一個包含全部路由的index.html
,若是static
目錄不存在,不會自動建立目錄生成index.html
watch
監控文件變化自動從新加載jsr.config.js
simplemodule.exports = {
root: 'mock',
port: 3000,
}
複製代碼
json-server-router
其底層依賴json-server所構建,因此在不出意外的狀況下同時也擁有json-server
的全部GET
請求相關功能函數
當使用json-server
咱們能夠經過構建路由/get/users?_page=7&_limit=10
進行分頁查詢可是query
的關鍵詞必須是指定的 在json-server-router
中能夠再jsr.config.js
中自定義queryMap
字段來修改關鍵詞的名字,配置好了以後就能夠經過/get/users?page=7&len=10
進行分頁查詢
//jsr.config.js
{
queryMap: [['_page', 'page'], ['_limit', 'len']]
}
複製代碼
關於非GET
請求你不須要定義mock files
,json-server-router
對全部非GET
請求進行統一處理無論其路由是什麼一致經過handler函數處理
{
"body": {},
"code": 200,
"ip": "::1",
"message": "succeed",
"url": "/books/"
}
複製代碼
jsr.config.js
中的handler 函數自定義其處理結果//jsr.config.js
{
/** * 處理全部非GET請求 * 當query fial 有值的時候認爲請求設置爲失敗狀態 */
handler (req, res, next) {
const { ip, originalUrl, body } = req
const isFail = !!req.query.fail
res.json({
code: isFail ? 500 : 200,
message: isFail ? 'failed' : 'succeed',
cookie: req.get('cookie'),
ip,
url: originalUrl,
body: body
})
}
}
複製代碼
爲了完成將非GET請求跟GET一致的行爲,對 mock 數據添加了配置 "list[get]"
生成的路由不會包含[get]
當用POST 訪問 /xxxx/list
時就會獲得mock文件中定義的數據
{
"list[get]": [
{ "id": 0, "name": "book1" },
{ "id": 1, "name": "book2" },
{ "id": 2, "name": "book3" }
]
}
複製代碼
當jsr
運行起來以後在命令窗口鍵入rs
會從新加載
當static
路徑存在的時候,路由/jsr
會返回全部路由信息,當static
路徑不存在的時候路由/
會返回全部路由信息