前後端分離–MockJS模擬API返回數據

  • 2019 年 12 月 10 日
  • 筆記

其實,我們都知道前後端分離已經逐漸成為業界項目開發標準方式。在Web開發前後端不分離的時代,開發人員既要開發前端,還得開發後端,而且視圖和業務邏輯混合在一起,這時候一般我們一個完整的開發流程是這樣的:前端根據UI設計稿設計html界面,然後後端實現服務接口,等服務接口實現完畢後,後端將前端的html改成jsp並集成後端開發的服務接口,最終測試進行上線。這種方式缺點很明顯,前端無法單獨進行調試而且前端jsp代碼混雜後端業務邏輯,而且前端工作嚴重依賴於後端。

所以慢慢衍生出以重新的架構模式,在開發階段前後端約定好Restful API的返回格式,然後後端業務邏輯設計Restful API,前端按照約定好的返回格式協同開發前端並獨立完成測試工作。等前後端工作都完成後,前後端一起進行聯調測試。這樣做的優點在於將前後端進行分離,代碼可維護性變強,而且前後端可以協同開發,開發效率更是可以大大提高。而剛才也說到了前後端可以協同開發,那前端如果開發完成如何在API還沒有完成的情況下機型模擬數據測試呢?所以本篇文章介紹一個前端開發利器—mockJS模擬Restful API 返回數據。

簡介

MochJS實際上就是一個模擬數據生成工具,可以模擬各種業務場景返回不同格式的數據。支持生成隨機文本、數字、日期、郵箱、顏色、圖片等。而且使用非常簡單,我們使用MockJS就可以實現後端Restful API還未提供的情況下前端完成模擬測試。

安裝

MockJS安裝其實很簡單,我們使用npm安裝下依賴就可以,使用命令:

npm install mockjs --save

MockJS語法規則

MockJS基本語法其實很簡單,我們可以使用Mock.mock()指定一個測試url,然後指定返回格式的模板,格式模板按照和後端返回的格式去設計。同時我們還可以使用Mock.setup()設置配置信息如超時時間等,目前Mock.setup()僅能用於配置ajax請求。

Mock.mock(url, template);    Mock.setup(setting);

MockJS簡單使用

其實使用Mock一般有兩種方案,前端直接使用Mock以及使用Node搭建一個可停止服務的Mock服務。這兩種方案有什麼區別呢?我們先來看看第一種方案,在前端項目中直接引用Mock。首先我們先創建一個api.js用於配置Mock的基本配置信息:

import Mock from 'mockjs';    const url = {      testUrl: 'http://api.niyueling.cn/test/testOne',  }  module.exports = [      Mock.mock(url.testUrl, {          "userInfo|4": [{ //生成num個userInfo的數據              "id|+1": 1, //數字從1開始後續依次加一              "name": "@cname", //名字為隨機中文名字              "ago|18-28": 25, //年齡為18-28之間的隨機數字              "sex|1": ["男", "女"], //性別是數組中的一個,隨機的              "job|1": ["web", "UI", "python", "php"] //工作是數組中的一個          }]      })  ]

然後接下來我們去頁面組件中調用我們剛才配置的url。看看有什麼效果:

var that = this;    this.$req({      method: "get",      url: 'http://api.niyueling.cn/test/testOne',      data: {        }  }).then(function(res) {      console.log(res);  }).catch(function(e) {      _this.$message.error('服務器可能出現異常!');  });

然後我們可以看看控制台打印的信息:

{    userInfo: [      { id: 1, name: '閻傑', ago: 24, sex: '男', job: 'python' },      { id: 2, name: '杜軍', ago: 18, sex: '男', job: 'UI' },      { id: 3, name: '秦秀蘭', ago: 24, sex: '男', job: 'php' },      { id: 4, name: '周剛', ago: 26, sex: '女', job: 'python' }    ]  }

按照我們想要的效果返回數據了,可以發現mock的使用很簡單,但是這種集成在前端項目裏面存在一個問題:如果後端Restful API實現完畢,前端需要將這部分調用mock的代碼注釋掉,不然真正的API調用會被mock攔截掉。這樣前端會改動來改動去工作量大還不好維護。所以我們可以使用第二種方案:使用Node搭建一個簡單的可停止運行的Mock服務。考慮到一部分人沒使用過Node,不知道什麼是express,什麼是路由,所以我們可以直接使用express構建器快速搭建一個小型express項目,express項目裏面項目路由都是配置成功的,我們可以直接實現Mock接口服務:

//全局安裝express-genetator項目構建器  npm install -g express-generator    //使用全局構建器創建一個express項目,名稱為demo_project  express demo_project    //進入項目安裝依賴  cd demo_project && npm install

接着我們就可以開始設計Mock服務,express項目默認給我們配置好兩個路由,我們可以打開routes/users.js實現第一個Mock路由:

var Mock = require('mockjs')    xlsMallRouters.testMock = function (req, res) {      var par = paramAll(req);        return res.json(new PKG(Mock.mock({          "userInfo|4": [{ //生成|num個如下格式名字的數據              "id|+1": 1, //數字從當前數開始後續依次加一              "name": "@cname", //名字為隨機中文名字              "ago|18-28": 25, //年齡為18-28之間的隨機數字              "sex|1": ["男", "女"], //性別是數組中的一個,隨機的              "job|1": ["web", "UI", "python", "php"] //工作是數組中的一個          }]      })));  }  router.post('/testMock', xlsMallRouters.testMock);

然後通過app.js文件,我們可以定位到項目運行於9000端口,routes/users.js這個路由文件對應路由為users, 上面代碼使用router.post表示應該是post請求,所以這個Mock服務的完整url應該如下:

http://127.0.0.1:9000/users/testMock  POST

我們可以調用Mock服務地址測試返回結果:

{      "status": 200,      "payload": {          "userInfo": [              {                  "id": 1,                  "name": "葉洋",                  "ago": 22,                  "sex": "女",                  "job": "web"              },              {                  "id": 2,                  "name": "秦超",                  "ago": 22,                  "sex": "男",                  "job": "python"              },              {                  "id": 3,                  "name": "程傑",                  "ago": 27,                  "sex": "男",                  "job": "php"              },              {                  "id": 4,                  "name": "潘娟",                  "ago": 22,                  "sex": "女",                  "job": "UI"              }          ]      }  }

數據格式返回和剛才完全一致,但是多了一個優點在於後端Restful API還未實現,而前端需要測試,我們就可以使用npm run start命令你個啟動這個Mock服務獲取返回數據進行測試,當後端API實現完成,我們就停止這個Mock服務的運行,就不需要頻繁改動前端的代碼。比如我們需要實現登錄功能,我們可以略微改動返回格式,將返回格式改為返回用戶信息即可:

xlsMallRouters.testMock = function (req, res) {      var par = paramAll(req);        return res.json(new PKG(Mock.mock({          "userInfo|1": [{ //登錄成功返回用戶信息              "id|+1": 1, //數字從當前數開始後續依次加一              "name": "@cname", //名字為隨機中文名字              "ago|18-28": 25, //年齡為18-28之間的隨機數字              "sex|1": ["男", "女"], //性別是數組中的一個,隨機的              "job|1": ["web", "UI", "python", "php"], //工作是數組中的一個              token: "TKN:R:r:D:QZtyGm5HDZAxi:lxy" //用戶登錄憑證          }]      })));  }  router.post('/testMock', xlsMallRouters.testMock);

關於Mock的基本使用有很多封裝好的隨機數方法,不過語法都比較簡單,有需要的自己查看官方文檔,貼下官方文檔地址:

https://github.com/nuysoft/Mock/wiki/Getting-Started