//引入模塊
const Koa = require("koa");
const Router = require("koa-router");
const bodyParser = require("koa-bodyparser");
const fs = require("fs");
const path = require("path");
const os = require("os");
const moment = require("moment");
//實例化
const app = new Koa();
const router = new Router();
const port = "5050";
const host = (() => {
let address = "";
const interfaces = os.networkInterfaces(); //建立接口
Object.values(interfaces).find(item => {
const result = item.find(
({ family, internal }) => family === "IPv4" && internal === false,
);
if (result) {
address = result.address;
return true;
}
});
return address;
})();
//請求處理
app.use(async (ctx, next) => {
await next();
console.log(`${ctx.method} ${ctx.url}`);
});
app.use(bodyParser());
router
.all("/", (ctx, next) => {
ctx.body = `<h1 align="center" style="color: red">舒適提示:請求路徑不正確!</h1>`;
})
.all("/index.html", (ctx, next) => {
ctx.body = fs.readFileSync(__dirname + "/index.html", "utf8");
})
.all(["/app/api/", "/app/api/:apiName"], async (ctx, next) => {
await next();
const apiName = ctx.params.apiName;
const method = ctx.request.method;
let request_data = {};
if (method === "GET") {
request_data = ctx.request.query;
} else {
request_data = ctx.request.body;
}
let body = createResponseData("無數據");
const type = [".js", ".json"].find(item => {
return fs.existsSync(
path.resolve(__dirname, "data", apiName + item),
);
});
const filePath = path.resolve(__dirname, "data", apiName + type);
if (type === ".json") {
body = fs.readFileSync(filePath, "utf8");
} else if (type === ".js") {
body = await require(filePath)(request_data);
}
ctx.type = "application/json;charset=utf-8";
ctx.body = body;
});
app.use(router.routes()).use(router.allowedMethods());
//建立服務器
app.listen(port);
console.log(`mockServer runing on ${host}:${port}`);
//響應數據建立輔助方法
const createResponseData = (response_data, response_header = {}) => {
return {
header: Object.assign(
{
res_code: "0000",
res_desc: "接口數據請求成功",
responseTime: moment().format("YY-MM-DD hh:mm:ss"),
},
response_header,
),
response: response_data,
};
};
module.exports = { createResponseData };
複製代碼
const server = require("../server");
module.exports = request_data => {
const { heroId } = request_data;
console.log("請求入參" + heroId);
return new Promise((resolve, reject) => {
const response_header = {};
const response_data = server.createResponseData(MockData.get(heroId));
resolve(response_data, response_header);
});
};
//模擬的數據
const MockData = new Map([[key, value],[key, value]]);
複製代碼
連接:koa官網css
const Koa = require('koa');
const app = new Koa();
app.listen(3000);
app.context.db = db(); //經過編輯 app.context 爲 ctx 添加其餘屬性
app.use(async (ctx, next) => {
await next();
ctx.body = 'Hello World';
});
app.use(async ctx => {
console.log(ctx.db);
});
app.on('error', (err, ctx) => { //添加錯誤事件監聽器
log.error('server error', err, ctx);
});
複製代碼
ctx.state.user = await User.find(id);html
signed 所請求的cookie應該被簽名json
maxAge 一個數字表示從 Date.now() 獲得的毫秒數
signed cookie 簽名值
expires cookie 過時的 Date
path cookie 路徑, 默認是'/'
domain cookie 域名
secure 安全 cookie
httpOnly 服務器可訪問 cookie, 默認是 true
overwrite 一個布爾值,表示是否覆蓋之前設置的同名的 cookie (默認是 false). 若是是 true, 在同一個請求中設置相同名稱的全部 Cookie(無論路徑或域)是否在設置此Cookie 時從 Set-Cookie 標頭中過濾掉。
複製代碼
ctx.header
ctx.headers
ctx.method
ctx.method=
ctx.url
ctx.url=
ctx.originalUrl
ctx.origin
ctx.href
ctx.path
ctx.path=
ctx.query
ctx.query=
ctx.querystring
ctx.querystring=
ctx.host
ctx.hostname
ctx.fresh
ctx.stale
ctx.socket
ctx.protocol
ctx.secure
ctx.ip
ctx.ips
ctx.subdomains
ctx.is()
ctx.accepts()
ctx.acceptsEncodings()
ctx.acceptsCharsets()
ctx.acceptsLanguages()
ctx.get()
複製代碼
ctx.body
ctx.body=
ctx.status
ctx.status=
ctx.message
ctx.message=
ctx.length=
ctx.length
ctx.type=
ctx.type
ctx.headerSent
ctx.redirect()
ctx.attachment()
ctx.set()
ctx.append()
ctx.remove()
ctx.lastModified=
ctx.etag=
複製代碼
>> 爲屬性賦值則爲設置屬性值,如:request.headers= 爲設置請求頭 <<
request.headers //請求標頭對象,別名request.header。
request.method //請求方法。
request.length //請求的 Content-Length, Number或 undefined
request.url //獲取請求 URL.
request.originalUrl //獲取請求原始URL。
request.origin //獲取URL的來源,包括 protocol(協議) 和 host。
request.href //獲取完整的請求URL,包括 protocol,host 和 url(路由傳參)。
request.path //獲取請求路徑名。
request.querystring //獲取原始查詢字符串。
request.search //獲取原始查詢字符串。
request.host //獲取當前主機(hostname:port)
request.hostname //獲取主機名
request.type //獲取請求Content-Type
request.charset //獲取請求字符集, 如utf-8
request.query //獲取查詢字符串對象
request.protocol //獲取請求協議
複製代碼
response.headers
response.socket //請求套接字。
response.status //獲取響應狀態。
response.message //獲取響應的狀態消息
response.length
response.body //獲取響應主體。
response.type
response.redirect(url, [alt]) //重定向到 url。
response.attachment([filename], [options]) //將 Content-Disposition 設置爲 「附件」 以指示客戶端提示下載
response.flushHeaders() //刷新任何設置的標頭,並開始主體。
複製代碼