mock工具-基于koa的本地mock实现方案

274 阅读2分钟

0.初始化项目

npm init -y

1.启动koa服务器

// 引入koa
const koa = require('koa')
// 启动koa
const app = koa()
// 监听8080
app.listen(8080)

2.配置koa路由

路由就是根据不同的URL 地址,加载不同的页面实现不同的功能。

  • 安装koa-router npm i koa-router

  • 配置koa-router

      /*app.js*/
      const Koa = require('koa');
      const router = require('koa-router')(); //注意:引入的方式
      const app = new Koa();
      router.get('/api', function (ctx, next) {
          ctx.body = "Hello koa";
      })
      router.get('/api/news', (ctx, next) => {
          ctx.body = "news"
      });
      app.use(router.routes()); //作用:启动路由
      // router.allowedMethods()中间件,主要用于 405 Method Not Allowed 这个状态码相关;如果不使用,前端发起get请求,而接口时post请求,会返回404,不利于前端调试
      app.use(router.allowedMethods());
      /* 作用: 这是官方文档的推荐用法,我们可以看到router.allowedMethods()用在了路由匹配
      router.routes()之后,目的在于:根据ctx.status 设置response 响应头
      */
      app.listen(8080, () => {
          console.log('starting at port 8080');
      });
    

    浏览器输入:http://localhost:8080/api 输出:Hello 浏览器输入:http://localhost:8080/api/news 输出:news

    3.glob工具包

    ​glob​​​ 是一种文件匹配模式,比如我们常见 ​​*.js​​​ 匹配所有 ​​js​​​ 文件就是使用了 ​​glob​​ 模式 使用方法: glob(pattern, [options], callback) , glob 方法接收三个参数:

    • pattern: 匹配规则字符串
    • options: 配置项(可选)
    • callback: 回调函数 (error, files) => {}
    • error: 错误信息,如果不存在则为成功
    • matches: 匹配文件数组
    const glob = require( "glob")
    // ./api/**/*.json 表示找到api文件下的所有以 .json 结尾的文件
    glob("**/*.json", (error, matches) => {
      if(!error) {  
        console.log(matches); // 输出.json 结尾的文件 例:[ './api/news/news1.json', './api/user/uuid1.json' ]
      }
    });
    

    4.实现

    glob("./api/**/*.json", (error, matches) => {
        if (!error) {
            matches.forEach((item, i) => {
                // 将./api/news/news1.json 转为 /news/news1.json
                let apiJsonPath = item && item.split('/api')[1];
                // 将/news/news1.json 转为 /news/news1
                let apiPath = apiJsonPath.replace('.json', '');
                // 通过fs读取文件内容
                console.log(fs.readFileSync(item).toString());
                // 通过文件夹的名称调用对应接口数据,例如:http://localhost:8080/news/news1
                router.get(apiPath, (ctx, next) => {
                    let jsonStr = fs.readFileSync(item).toString();
                    ctx.body = {
                        data: JSON.parse(jsonStr),
                        state: 200,
                        type: 'success'
                    }
                });
            })
        }
    });
    

接口数据文件 Snipaste_2022-11-21_14-20-51.png 调用接口输出内容 Snipaste_2022-11-21_14-20-06.png