资讯专栏INFORMATION COLUMN

造轮子:用Node写一个API Mock

DevTTL / 1110人阅读

摘要:使用写一个服务实现思路读取文件夹遍历文件尝试导入文件内容将文件内容拼接成一个对象将请求类型空格请求地址作为当收到的请求能在对象中找到就返回结果找不到结果返回获取文件内容同步读取文件夹对象汇总遍历文件只读取文件容错,可能文件内容有问题只合并对

使用Node写一个Mock服务

实现思路:

读取mock文件夹

遍历.js文件

尝试导入文件内容

将文件内容拼接成一个对象

请求类型 + 空格 + 请求地址作为key

当收到的请求能在js对象中找到就返回结果

找不到结果返回404

获取文件内容
    // ./src/utils/getMock.js

    const fs = require("fs");
    const path = require("path");

    const getMockBundleOfDir = (mockDirPath) => {
        // 同步读取mock文件夹 
        const fileNameList = fs.readdirSync(mockDirPath);
        // mock对象汇总
        let mockBundle = {};
        // 遍历文件
        fileNameList.forEach(fileName => {
            const filePtah = path.resolve(`${mockDirPath}/${fileName}`);
            // 只读取JS文件
            if (fileName.endsWith(".js")) {
                // 容错,可能文件内容有问题
                try {
                    const content = require(filePtah);
                    // 只合并对象
                    if (Object.prototype.toString.call(content) === "[object Object]") {
                        Object.assign(mockBundle, content);
                    }
                } catch (error) {
                    console.log("33[41;37m", `读取${filePtah}文件出错`, "33[0m");
                }
            }
        })
        return mockBundle;
    }

    module.exports = getMockBundleOfDir;
实现解析
    const Koa = require("koa");
    const koaBody = require("koa-body");
    const loggerAsync = require("./src/middle/log.js");
    const getMockBundleOfDir = require("./src/utils/getMock.js");

    const toString = Object.prototype.toString;
    const mockDirPath = "./src/mock"; // mock目录地址

    // 获取mock对象集合
    let mockBundle = getMockBundleOfDir(mockDirPath);

    const app = new Koa();
    app.use(koaBody()); // koa插件,用来解析post请求的body

    // mock请求
    app.use(async (ctx, next) => {
        // 对应mock的请求类型 + 空格 + 请求地址的映射
        const request = `${ctx.method} ${ctx.path}`;
        // TODO 容错
        try {
            const mock = mockBundle[request];
            const mockType = toString.call(mock);
            if (mockType === "[object Function]") { // mock数据为函数
                let query;
                if (ctx.method === "GET") {
                    query = ctx.query;
                } else if (ctx.method === "POST") {
                    query = ctx.request.body;
                }
                // 返回mock结果
                const response = mock(query);
                return ctx.body = response;
            } else if (mock) { // 有值
                return ctx.body = mock;
            }
        } catch (error) {
            ctx.status = 500;
            return ctx.body = {
                error,
                msg: "mock函数执行出错"
            }
        }
        // 找不到mock函数,那么next
        next();
    })


    // 底线
    app.use(async ctx => {
        let html = `
            

404

请确认URL是否正确、请求类型是否大写

`; ctx.status = 404; ctx.body = html }) app.on("error", err => { console.error("系统错误", err) }); app.listen(3333, () => { // console.log(process.argv, "argv") console.log("33[44;37m > 开始运行 ", "端口3333", "33[0m"); });
源码地址

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/110018.html

相关文章

  • 10秒钟构建你自己的”轮子”工厂! 2019年github/npm工程化协作开发栈最佳实践

    摘要:年工程化协作开发栈最佳实践我们将花半小时实战撸一个包含,的标准的用于工程协作的包开发栈。使用脚手架,秒钟构建可自由配置的开发栈。分别表示询问弹窗自动执行任务执行任务后操作。 发起一个github/npm工程协作项目,门槛太高了!! 最基础的问题,你都要花很久去研究: 如何在项目中全线使用es2017代码? 答案是babel 如何统一所有协作者的代码风格? 答案是eslint + pr...

    dongfangyiyu 评论0 收藏0
  • React 轮子系列:Icon 组件思路

    简介 本轮子是通过 React + TypeScript + Webpack 搭建的,至于环境的搭建这边就不在细说了,自己动手谷歌吧。当然可以参考我的源码。 这里我也是通过别人学的,主要做些总结及说明造各个轮子的一种思路,方便今后使用别人的的轮子时自己脑中有造轮子的思想,能通过修改源码及时修改 bug,按时上线。 本文的 Icon 组件主要是参考 Framework7 中的 Icon React ...

    stormzhang 评论0 收藏0
  • React 轮子系列:Icon 组件思路

    简介 本轮子是通过 React + TypeScript + Webpack 搭建的,至于环境的搭建这边就不在细说了,自己动手谷歌吧。当然可以参考我的源码。 这里我也是通过别人学的,主要做些总结及说明造各个轮子的一种思路,方便今后使用别人的的轮子时自己脑中有造轮子的思想,能通过修改源码及时修改 bug,按时上线。 本文的 Icon 组件主要是参考 Framework7 中的 Icon React ...

    instein 评论0 收藏0
  • 尝试了个工具类库,名为 Diana

    摘要:的另一种形式测试踩坑之路代码覆盖率单元测试的代码覆盖率统计,是衡量测试用例好坏的一个的方法。 showImg(https://segmentfault.com/img/remote/1460000012564211?w=640&h=280); 项目地址: diana文档地址: http://muyunyun.cn/diana/ 造轮子的意义 为啥已经有如此多的前端工具类库还要自己造轮...

    zhichangterry 评论0 收藏0
  • 在NPM发布自己轮子

    摘要:在发布自己造的轮子前言自从出现,它的好基友也是我们日常开发中必不可少的东西。 在NPM发布自己造的轮子 1、前言 自从Node.js出现,它的好基友npm(node package manager)也是我们日常开发中必不可少的东西。npm让js实现了模块化,使得复用其他人写好的模块(搬砖)变得更加方便,也让我们可以分享一些自己的作品给大家使用(造轮子),今天这里我就给大家分享一个用命令...

    binaryTree 评论0 收藏0

发表评论

0条评论

DevTTL

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<