mockServer 簡易服務器搭建

Koa-Server

//引入模塊
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

連接: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);
});
複製代碼

Context的屬性和方法:

  • ctx.req:Node 的 request 對象。
  • ctx.res:Node 的 response 對象。
  • ctx.request: koa 的 Request 對象。
  • ctx.response: koa 的 Response 對象。
  • ctx.state: 經過中間件傳遞信息

    ctx.state.user = await User.find(id);html

  • ctx.app:應用程序實例引用。
    • ctx.app.emit(event,function):添加監聽事件。
  • ctx.cookies.get(name, [options]): 經過 options 獲取 cookie name。

    signed 所請求的cookie應該被簽名json

  • ctx.cookies.set(name, value, [options]):經過 options 設置 cookie name 的 value。
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.throw([status], [msg], [properties]):默認拋出一個500的錯誤。
  • ctx.assert(value, [status], [msg], [properties]):拋出錯誤。
獲取Request屬性:
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()
複製代碼
獲取Response屬性:
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=
複製代碼
ctx.request的屬性和方法:
>> 爲屬性賦值則爲設置屬性值,如: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 //獲取請求協議
複製代碼
ctx.response的屬性和方法:
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() //刷新任何設置的標頭,並開始主體。
複製代碼
相關文章
相關標籤/搜索