如何使用koa来搞个前端模拟桩:
1、scripts/serverConfig.js
const Koa = require("koa");
const Router = require("koa-router");
const bodyParser = require("koa-bodyparser")
const app = new Koa();
const router = new Router();
const fs = require("fs");
const path = require("path");
var os = require("os");
app.use(bodyParser());
var ifaces = os.networkInterfaces();
const PORT = 2999;
let ipAddress = "0.0.0.0";
Object.keys(ifaces).forEach(function (ifname) {
var alias = 0;
ifaces[ifname].forEach(function (iface) {
if ("IPV4" === iface.family || iface.internal !== false) {
return;
}
if (alias >= 1) {
ipAddress = iface.address;
} else {
ipAddress = iface.address;
}
++alias;
})
})
//logger
app.use(async (ctx, next) => {
await next();
console.log("--------------");
console.log("ctx", ctx)
console.log(`${ctx.method}${ctx.url.split("?")[0]}`);
console.log(decodeURIComponent(ctx.request.querystring));
console.log(ctx.request.body);
console.log("---")
})
router.all("/", (ctx, next) => {
const url = `http://${ipAddress}:${PORT}/api/queryNumlist`;
ctx.body = `
<h1>url error</h1>
<p>url正确姿势如:
<a href="${url}" target="_blank">${url}</a>
</p>
<p>Please check your url!!!</p>
`
}).all("/app/(.*)", async (ctx, next) => {
await next();
const apiNames = ctx.request.url.split("?")[0].split("/");
const apiName = `${apiNames[apiNames.length - 1]}`;
let body;
const exts = [".js", ".json"];
let ext;
//通过遍历exts,获取对应的服务端处理逻辑文件是js or json
for (let i = 0; len = exts.length, i < len; i++) {
ext = exts[i];
const _p = path.resolve(__dirname, "../data", apiName + ext);
console.log("文件路径", _p)
// 判断文件是否存在
if (fs.existsSync(_p)) {
body =
ext === ".json"
? fs.readFileSync(_p, "utf8")
: await require(_p)(ctx)
break;
}
}
const sleep = () => new Promise(res => setTimeout(() => res(), 300 + Math.floor(Math.random() * 1000)));
await sleep();
ctx.type = "application/json;charset=utf-8";
// 处理没数据
if (body) {
ctx.body = body;
} else {
ctx.status = 404
}
});
app.use(router.routes()).use(router.allowedMethods());
const server = app.listen(PORT);
console.log(`server running on ${ipAddress}:${server.address().port}`)
2、scripts/serverHelper.js
module.exports = {
createRespData: (menuid, body, header = {}) => {
const t = Date.now();
return {
header: {
retCode: "0",
errorNo: "errorNo",
errorMsg: "errorMsg",
...header
},
body
}
}
// menageServNumber:"17821327890"
}
3、然后就是准备data数据
data/queryXxx.js
const faker = require("faker");
faker.locale = "zh_CN";
const { createRespData } = require("../scripts/serverHelper");
module.exports = ctx => {
return new Promise(res => {
res(
createRespData(
"queryContact",
{
contacts: [...Array(3)].map((item, i) => ({
contactId: "idNo" + i,
address: faker.address.streetAddress,
})),
pagenation: {
total: "",
current: "1",
}
},
{ retCode: "0", errorMsg: "数据不见了" }
)
)
})
}
在这之前需要下载对应的依赖
- npm install koa
- npm install faker
- npm install koa-router --save
- npm install koa-bodyparser
热更新操作
下载依赖 npm install -g nodemon
在package.json文件中scripts模块下添加
"server": "nodemon --inspect --watch ./data/* -e ts,tsx,js --exec node ./scripts/serverConfig.js"
nodemon来监控文件的改变, 使用ts-node(类似,执行了 tsc && node dist/server.js)或者node启动服务。