美文网首页
用node写一个简易的mock服务器

用node写一个简易的mock服务器

作者: 小遁哥 | 来源:发表于2020-10-25 11:48 被阅读0次

毫不夸张的讲,联调接口太痛苦了,尤其是碰上不靠谱的后端。

由于依赖关系,前端显得十分被动,连接不到服务器、状态过期、服务器挂了、没有数据啦、调用就报错啦。

前端被迫承担了测试接口的工作,这个过程就是个灰色区域,应该被好好的追踪和监管,团队的效率才能大幅度上升。

虽然,很多脚手架也提供了mock服务,但总感觉不是很方便,不如node的集成容易,"前端需要的是特定的数据,在精不在多",配合上nginx的请求转发,配置两个端口,一个mock环境,一个真实的环境。

mockApi.js

(function getApis() {
  return {
    '/api/hero/list': '../json/heroList.json',
    '/api/hero/\\d+': {
      supportRegexp: true,
      get: {
        success: true,
        data: {
          name:"klo"
        }
      }
    }
    '/api/hero': {
      get: {
        success: true,
        code: '200',
        message: '',
        data: [],
      },
      post: {
        success: true,
        code: '200',
        message: '',
        data: {
          name:
        },
      },
    },
    '/api/hero/history': {
      success: true,
      code: '200',
      message: '',
      data: {
          time:"",
          content:""
      },
    }
})();

通常情况下我们不需要关心请求方法和参数的

  • 可以读取json文件
  • 对于一个url多用的,可以通过方法名区分
  • 支持正则匹配,类似/api/hero/1/api/hero/2,为了避免无辜url被迫陷入正则匹配中,通过supportRegexp:true进行强调

后续有需要,还可以通过函数的方式来支持逻辑

mockServic.js

const config = {
  port: 9192,
};

function start() {
  var http_os = require('http');
  var file_os = require('fs');
  //动态的获取本机IP地址
  var os = require('os');
  let network = os.networkInterfaces();
  for (let key in network) {
    let env = network[key];
    for (var i = 0; i < env.length; i++) {
      if (env[i].family == 'IPv4' && env[i].address != '127.0.0.1') {
        IPv4 = env[i].address;
      }
    }
  }
  var server = http_os.createServer(function (request, response) {
    try {
      let heades = {
        'Content-Type': 'application/json',
      };
      if (request.headers.origin) {
        //发生跨域 使用nginx代理时没有 request.headers.origin
        heades = {
          ...heades,
          'Access-Control-Allow-Methods':
            'DELETE,PUT,POST,GET,OPTIONS',
          'Access-Control-Allow-Origin': request.headers.origin,
          'Access-Control-Allow-Headers': 'content-type',
          'Access-Control-Allow-Credentials': true,
        };
      }
      const apis = eval(
        file_os.readFileSync('./mockApi.js', 'utf-8'),
      );
      let url = request.url.split('?')[0];
      if (!apis[url]) {
        //
        for (const [key, value] of Object.entries(apis)) {
          if (value.supportRegexp) {
            if (new RegExp(key).test(url)) {
              url = key;
              break;
            }
          }
        }
      }
      console.log({ [url]: apis[url] });
      const method = request.method.toLowerCase();
      if (apis[url]) {
        response.writeHead(200, heades);
        if (typeof apis[url] === 'string') {
          const json = file_os.readFileSync(apis[url], 'utf-8');

          response.end(json);
        } else {
          let data = apis[url][method];
          if (!data) {
            data = apis[url];
          }
          response.end(JSON.stringify(data));
        }
      } else {
        response.writeHead(500, heades);
        response.end('404');
      }
    } catch (error) {
      dealError(response, error);
    }
  });
  function dealError(response, error) {
    console.log(error);
    response.writeHead(500, heades);
    response.end(error.stack);
  }
  server.setTimeout(0);
  server.listen(config.port, function () {
    console.log(`service is running ${IPv4}:${config.port}`);
  });
  server.on('error', function (error) {
    console.log(error);
    if (error.toString().indexOf(`listen EADDRINUSE`) !== -1) {
      console.log(
        `${config.port}端口被占用,可能是当前应用,也可能是其他应用`,
      );
    }
  });
}

start();

支持跨域,输出ip和端口

简单的nginx配置,不会影响热更新哦

 server {
      set $localhost  http://127.0.0.1:9000;
        listen       8002;
        server_name  web.seven.net; 
        #WebServer
        location /api {
           proxy_pass http://192.168.1.100:9192;
        }
       
        location / {
          proxy_pass $localhost;
         
        }
        
    }

相关文章

  • 用node写一个简易的mock服务器

    毫不夸张的讲,联调接口太痛苦了,尤其是碰上不靠谱的后端。 由于依赖关系,前端显得十分被动,连接不到服务器、状态过期...

  • 用node express搭建一个简易的websocket服务器

    如题,用node express搭建一个简易的websocket服务器。 项目开始 首先,按照官方教程( expr...

  • 如何mock数据

    mock数据有搭建本地服务器mock和通过线上网站mock数据两种方法:1.搭建本地服务器安装node.js,使用...

  • 造轮子:用Node写一个API Mock

    使用Node写一个Mock服务 实现思路: 读取mock文件夹 遍历.js文件 尝试导入文件内容 将文件内容拼接成...

  • 我的 Mock Server - Meow Mock

    业余时间基于 Node.js 搭建了 Mock Server 一枚,自娱自乐的产物。功能较简易,非常非常非常小白级...

  • 静态服务器搭建

    目的 手写简易版搭建一个既能提供静态文件,又能处理动态路由mock数据的服务器。 前提 会用到nodejs的几个内...

  • 理解JSONP 上

    我们用node来做一个简易服务器理解JSONP,从而了解在没有Ajax的时代的前端是如何绞尽脑汁做好页面交互的 有...

  • node.js写一个爬虫

    引入 cheerio 模块 ,node.js 版的jqueryhttps 模块,封装了一个http服务器和一个简易...

  • 实践项目

    用Node.js+Mock.js模拟http请求仿饿了么微信小程序 跟随教程用Node.js+Webpack+ES...

  • node.js 实现搭建服务器并连接数据库实现增删查

    最近写vue,有时候打包后,想看看打包后的dist的效果,就想搭建一个简易的服务器,就去看了看node,发现nod...

网友评论

      本文标题:用node写一个简易的mock服务器

      本文链接:https://www.haomeiwen.com/subject/bybimktx.html