mockjs + json-server 搭建mock服務(wù)


title: mockjs + json-server 搭建mock服務(wù)
date: '2021-10-18'
categories:

  • JS
    tags:
  • mock
    publish: true

:::tip
前后端分離情況下,后端未開發(fā)完成橱鹏,前端使用mock自行模擬數(shù)據(jù)。
:::

// 目錄結(jié)構(gòu)
|-- mockServer
   |-- mock
       |-- db.json
   |-- index.js
   |-- middleware.js
   |-- package.json

一、安裝

npm i mockjs json-server nodemon cross-env glob -S

// package.json
"scripts": {
    "mock:server": "cross-env nodemon index.js --watch 'mock' --watch './middleware.js'"
  },

二辱匿、使用

// index.js
const path = require('path');
const fs = require('fs');
const jsonServer = require('json-server');
const mockJs = require('mockjs');
const Random = mockJs.Random;
const customMiddleware = require('./middleware');
const glob = require('glob');
const server = jsonServer.create();
const middlewares = jsonServer.defaults();
// mock數(shù)據(jù)趟脂,常駐內(nèi)存
let data = {}
/**
 * mock解析json文件
 * @param file
 * @returns {*}
 */
function parsingToMockJs(file) {
    const json = fs.readFileSync(file, 'utf-8');
    return mockJs.mock(JSON.parse(json));
}

/**
 * 合并json數(shù)據(jù)
 * @param path
 */
function mergeJsonData(path) {
    Object.assign(data, parsingToMockJs(path));
}

/**
 * 掃描mock目錄励稳,生成mock數(shù)據(jù)
 */
glob(path.join(__dirname, `/mock/*.json`), {}, (err, files) => {
    files.forEach(item => {
        mergeJsonData(item);
    });
   
    const router = jsonServer.router(data);

    // 自定義路由
    server.post('/api/upload/image', (req, res) => {
        res.jsonp({
            id: Random.image('300x250', Random.color())
        });
    })

    server.use(jsonServer.bodyParser);
    server.use(middlewares);
    // 添加響應(yīng)頭
    server.use((req, res, next) => {
        res.header('author', 'Ice');
        next();
    });

    server.use(customMiddleware);

    // 數(shù)據(jù)統(tǒng)一封裝
    router.render = (req, res) => {
        res.jsonp({
            success: true,
            code: 0,
            msg: 'success',
            data: res.locals.data
        });
    }
    server.use('/api', router);
    server.listen(3000, () => {
        console.log('Mock server is running......')
    });
});



// middleware.js
const mockJs = require('mockjs');
const Random = mockJs.Random;

module.exports = (req, res, next) => {
  // 可以對請求進(jìn)行特殊操作
  console.log(req.body);
  console.log(req._parsedUrl);
  if(req.method === 'POST' && req._parsedUrl.pathname === '/api/dynamics') {
    req.body.imageUrl = Random.image('300x250', Random.color());
    req.body.viewCount = Random.natural(1, 1000);
  }

  next()
}

// 啟動
npm run mock:server
  • 1、分頁列表請求

    • 數(shù)據(jù)

      // db.json 
      // 一百條數(shù)據(jù)
      {
        "dynamics|100": [
          {
            "id|+1": 1,
            "title": "@cparagraph()",
            "imageUrl": "@image",
            "viewCount": "@natural(1, 1000)"
          }
        ]
      }
      
    • 請求

      GET: http://localhost:3000/api/dynamics?_page=1&_limit=20
      
  • 2凳谦、刪除一條數(shù)據(jù)

    • 數(shù)據(jù)同1

    • 請求

      // 刪除第一條
      DELETE: http://localhost:3000/api/dynamics/1
      
  • 3、獲取一條數(shù)據(jù)

    • 數(shù)據(jù)同1
    • 請求
    // 獲取第一條
    GET: http://localhost:3000/api/dynamics/1
    
  • 4衡未、修改一條數(shù)據(jù)

    • 數(shù)據(jù)同1

    • 請求

      // 修改第一條
      PATCH: http://localhost:3000/api/dynamics/1
      data: {
        title: 'xxx'
      }
      
  • 5尸执、添加一條數(shù)據(jù)

    • 數(shù)據(jù)同1
    • 請求
    // 修改第一條
    POST: http://localhost:3000/api/dynamics
    data: {
      title: 'xxx'
    }
    
  • 6家凯、上傳圖片

自定義路由在 server.use(jsonServer.bodyParser);之前。

// 自定義路由
  server.post('/api/upload/image', (req, res) => {
  //  這里還是不使用真實上傳的圖片
    res.jsonp({
        id: Random.image('300x250', Random.color())
    });
  })

原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末如失,一起剝皮案震驚了整個濱河市绊诲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌褪贵,老刑警劉巖掂之,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異脆丁,居然都是意外死亡世舰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門槽卫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跟压,“玉大人,你說我怎么就攤上這事晒夹●陕” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵丐怯,是天一觀的道長喷好。 經(jīng)常有香客問我,道長读跷,這世上最難降的妖魔是什么梗搅? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮效览,結(jié)果婚禮上无切,老公的妹妹穿的比我還像新娘。我一直安慰自己丐枉,他們只是感情好哆键,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瘦锹,像睡著了一般籍嘹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弯院,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天辱士,我揣著相機與錄音,去河邊找鬼听绳。 笑死颂碘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的椅挣。 我是一名探鬼主播头岔,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼塔拳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了峡竣?” 一聲冷哼從身側(cè)響起蝙斜,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澎胡,沒想到半個月后孕荠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡攻谁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年稚伍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戚宦。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡个曙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出受楼,到底是詐尸還是另有隱情垦搬,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布艳汽,位于F島的核電站猴贰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏河狐。R本人自食惡果不足惜米绕,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望馋艺。 院中可真熱鬧栅干,春花似錦、人聲如沸捐祠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽踱蛀。三九已至窿给,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間星岗,已是汗流浹背填大。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工戒洼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留俏橘,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓圈浇,卻偏偏與公主長得像寥掐,于是被迫代替她去往敵國和親靴寂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容