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官网

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);

  • ctx.app:应用程序实例引用。
    • ctx.app.emit(event,function):添加监听事件。
  • ctx.cookies.get(name, [options]): 通过 options 获取 cookie name。

    signed 所请求的cookie应该被签名

  • 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() //刷新任何设置的标头,并开始主体。
复制代码

转载于:https://juejin.im/post/5c7a17d66fb9a049ad77c2ca

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值