@aniyajs/rotor
Version:
基于webpack5开发的一款专注于打包、运行的工具
54 lines (43 loc) • 1.64 kB
JavaScript
const bodyParser = require("body-parser");
const chalk = require("chalk");
const createLocalMockServedMiddleware = (mockData, devServer) => {
// body-parser 只挂载一次
let bodyParserApplied = false;
return (req, res, next) => {
if (!mockData || Object.keys(mockData).length === 0) {
return next();
}
if (!bodyParserApplied) {
devServer.app.use(bodyParser.json());
bodyParserApplied = true;
}
const newMethodOrUrl = `${req.method.toLowerCase()} ${req._parsedUrl.pathname}`;
// 构建标准化的 mock 路由映射
let normalizedMockData = {};
for (const mockMU in mockData) {
const curMockMU = mockMU.match(/[\S]+/g);
if (curMockMU && curMockMU.length >= 2) {
normalizedMockData[`${curMockMU[0].toLowerCase()} ${curMockMU[1]}`] = mockData[mockMU];
}
}
const requestApi = normalizedMockData[newMethodOrUrl];
if (requestApi === undefined) {
return next();
}
// 直接在当前中间件中处理响应,不注册新路由
const apiType = Object.prototype.toString.call(requestApi);
if (apiType === "[object Function]") {
requestApi(req, res);
} else if (apiType === "[object AsyncFunction]") {
requestApi(req, res).catch((err) => {
console.log(chalk.red("Mock Error :>> "), err.message || err);
if (!res.headersSent) {
res.status(500).json({ error: err.message || "Mock handler error" });
}
});
} else {
res.json(requestApi);
}
};
};
module.exports = createLocalMockServedMiddleware;