博客 / 詳情

返回

後端:沒空,先自己 mock 去!

前言

後端開發忙,不給你接口?

後端抱怨你在測試過程中,頻繁的給髒數據?

後端修個接口很慢沒法測試?

有了 mockjs ,這些問題將迎刃而解。不要 998,pnpm i 帶回家!

真這麼絲滑?

請看我的使用方式:

當後端接口無法滿足要求,且不能及時更改時。例如後端返回

{
"err_no": 0,
"err_msg": "success",
"data": [

{
  "comment_id": "7337487924836287242",
  "user_info": {
    "user_name": "陳陳陳_",
  }
}

],
}

但我此時希望增加一個 user_type 來確定頁面的展示。

那我就直接起一個文件:user.js,把剛才的響應 copy 過來,並追加改動

myMock('/api/v1/user', 'post', () => {
return {

  "err_no": 0,
  "err_msg": "success",
  "data": [
    {
      "comment_id": "7337487924836287242",
      "user_info": {
        "user_name": "陳陳陳_",
        "user_type": "admin",
      }
    }
  ],

}
});

如此一來,這個請求就被無縫替換為了我們的 mock,可以隨便測試了。

機-會

技術大廠,前端-後端-測試,新一線和一二線城市等地均有機-會,感興趣可以試試。待遇和穩定性都不錯~

如何接入 mockjs

有的同學就要問了,主播主播,你的 mockjs 確實很方便,怎麼接入比較好呀。別急,我們一步一步來

1、安裝 mockjs

pnpm i mockjs

如果是使用 ts 的同學,可能需要額外安裝 type 類型包:@types/mockjs

2、新建一個 mock 文件夾,在 mock/index.ts 放入基本路徑

// 各種 mock 的文件,視條件而定,我這裏有倆文件就引入了倆
import './login/user.js';
import './model/model.js';

並且在你的項目入口 ts 中引入 mock/index.ts

import './mock/index'; // 引入 mock 配置

3、導出一個 myMock 方法,並追加一個 baseUrl 方便直接聯動你的 axios

import { ENV_TEST } from '@/api/config/interceptor';
import Mock from 'mockjs';

export const myMock = (
  path: string,
  method: 'get' | 'post',
  callback: (options: any) => any
) => {
  Mock.mock(`${ENV_TEST}${path}`, method, callback);
};

如此一來,你就可以在 mock 文件夾下去搞了,比如:

我想新增一個服務模塊的各類接口的 mock,那麼我就新增一個 service 文件夾,在其下增加一個 index.ts,並對對應路徑進行 mock

myMock('/api/v1/service', 'get', () => {
  return {
    code: 0,
    msg: 'hello service',
    data: null,
  };
});

另外,別忘了在 mock/index.ts 引入文件

不顯示在 network 中?

需要説明的是,這樣走 mock 是不會觸發真正的請求的,相當於 xhr 直接被 mock 攔截了下來並給了你返回值。所以你無法在 network 中看到你的請求。

這是個痛點,目前比較好的解決方案還是起一個單獨的服務來 mock。但這樣也就意味着,需要另起一個項目來單獨做 mock,太不優雅了。

有沒有什麼辦法,既可以走上述簡單的mock,又可以在需要的時候起一個服務來查看 network,並且不需要額外維護兩套配置呢?

有的兄弟,有的。

import express from 'express';
import bodyParser from 'body-parser';
import Mock from 'mockjs';
import './login/user.js';
import './model/model.js';
import { ENV_TEST } from './utils/index.js';

const app = express();
const port = 3010;

// 使用中間件處理請求體和CORS
app.use(bodyParser.json());

// 設置CORS頭部
app.use(( _ , res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  next();
});

// 設置Mock路由的函數
const setupMockRoutes = () => {
  const mockApis = Mock._mocked || {};

  // 遍歷每個Mock API,並生成對應的路由
  Object.keys(mockApis).forEach((key) => {
    const { rurl, rtype, template } = mockApis[key];
    const route = rurl.replace(ENV_TEST, ''); // 去掉環境前綴

    // 根據請求類型(GET, POST, 等)設置路由
    app[rtype.toLowerCase()](route, (req, res) => {
      const data =
        typeof template === 'function' ? template(req.body || {}) : template;
      res.json(Mock.mock(data)); // 返回模擬數據
    });
  });
};

// 設置Mock API路由
setupMockRoutes();

// 啓動服務器
app.listen(port, () => {
  process.env.NODE_ENV = 'mock'; // 設置環境變量
  console.log(`Mock 服務已啓動,訪問地址: http://localhost:${port}`);
});

直接在 mock 文件夾下追加這個啓動文件,當你需要看 network 的時候,將環境切換為 mock 環境即可。本質是利用了 Mock._mocked 可以拿到所有註冊項,並用 express 起了一個後端服務響應這些註冊項來實現的。

在擁有了這個能力的基礎上,我們就可以調整我們的命令


  "scripts": {
    "dev": "cross-env NODE_ENV=test vite",
    "mock": "cross-env NODE_ENV=mock vite & node ./src/mock/app.js"
  },

順便貼一下我的 env 配置:

export const ENV_TEST = 'https://api-ai.com/fuxi';
export const ENV_MOCK = 'http://localhost:3010/';

let baseURL: string = ENV_TEST;

console.log('目前環境為:' + process.env.NODE_ENV);
switch (process.env.NODE_ENV) {
  case 'mock':
    baseURL = ENV_MOCK;
    break;
  case 'test':
    baseURL = ENV_TEST;
    break;
  case 'production':
    break;
  default:
    baseURL = ENV_TEST;
    break;
}

export { baseURL };

這樣一來,如果你需要看 network ,就 pnpm mock,如果不需要,就直接 pnpm dev,完全不需要其他心智負擔。

三個字:

——轉載自:imoo

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.