首页 > 其他分享 >为项目添加mock的方法

为项目添加mock的方法

时间:2024-01-30 14:44:07浏览次数:21  
标签:function return resp req 添加 var 方法 mock

1.安装依赖  "underscore": "^1.13.4",  "util": "^0.12.3",

2.书写配置插件代码  mock-plugin.js

"use strict"; var sysFs = require("fs"); var jsVm = require("vm"); var sysUtil = require("util"); var sysPath = require("path"); var request = require("request"); var urlParser = require("url"); var queryString = require("querystring"); var _ = require("underscore"); var async = require("async"); var dataEncoding = "utf-8"; var mockManager = {   respFuncMap: {     proxy_pass: function (confResp, context, done) {       var mockUrlObj = urlParser.parse(confResp);       var mockQueryStringObj = queryString.parse(mockUrlObj.query);       var req = context.req;       var reqUrlObj = urlParser.parse(req.url);       var reqQueryStringObj = queryString.parse(reqUrlObj.query);       mockUrlObj.query = queryString.stringify(         {},         mockQueryStringObj,         reqQueryStringObj       );       mockUrlObj.search = "?" + mockUrlObj.query;       var proxyOptions = {         set_header: {},       };       proxyOptions.url = urlParser.format(reqUrlObj);       proxyOptions.headers = _.extend({}, req.headers, {         host: mockUrlObj.host,       });       var result;       var reqMethod = req.method.toUpperCase();       if (reqMethod === "GET") {         result = request.get(proxyOptions).pipe(context.resp);       } else if (reqMethod === "POST") {         result = request.post(proxyOptions).pipe(context.resp);       }       return result.on("end", function () {         return done();       });     },     raw: function (confResp, context, done) {       var jsonp = context.rule.jsonp || "callback";       var queryObj = context.req.query;       var callback;       for (var key in queryObj) {         if (key === jsonp) {           callback = queryObj[key];         }       }       var resp = context.resp;       var jsonString = mockManager.getContent(confResp);       if (callback) {         resp.setHeader("Content-Type", "application/x-javascript");         jsonString = [callback, "(", jsonString.trim(), ")"].join("");       } else {         resp.setHeader("Content-Type", "application/json");       }       resp.write(jsonString);       return done();     },     action: function (confResp, context, done) {       if (!sysUtil.isFunction(confResp)) {         var content = mockManager.getContent(confResp);         var mockRespBuffer = {           module: {},         };         var baseObj;         var resp = context.resp;         try {           jsVm.runInNewContext(content, mockRespBuffer);           baseObj = mockRespBuffer.module;           if (sysUtil.isFunction(baseObj.exports)) {             baseObj.exports(context.req, resp, context);           } else if (sysUtil.isObject(baseObj.exports)) {             resp.setHeader("Content-Type", "application/json");             resp.write(JSON.stringify(baseObj.exports), dataEncoding);           } else {             // TODO           }         } catch (e) {           console.log("执行", confResp, "失败:", e);         }       } else {         confResp(contex.req, resp, context);       }       return done();     },   },   init: function (mockConf) {     var confFileStat = sysFs.statSync(mockConf);     this.mockConf = mockConf;     this.mockConfMtime = confFileStat.mtime;     this.mockRules = [];     this.checkInterval = 1000;     this.doUpdate();     this.lastCheckTime = new Date();   },   getMockRule: function (url, method) {     var mockRules = this.mockRules;     var i, mockConfs, tmpRule, result;     for (var i = 0, mockConfs = mockRules.length; i < mockConfs; i++) {       tmpRule = mockRules[i];       if (sysUtil.isRegExp(tmpRule.pattern)) {         result = url.match(tmpRule.pattern);       } else {         if (method === "POST") {           result = url === tmpRule.pattern;         } else {           result = url.indexOf(tmpRule.pattern) === 0;         }       }       if (result) {         return tmpRule;       }     }     return null;   },   doResponse: function (mockRule, req, resp, options) {     var mockResp = mockRule.responder;     var actionKey = "action";     if (typeof mockResp === "string") {       actionKey = this.getActionKey(mockResp);     }     console.log(       "API REQUEST: ",       req.url,       " => mocked to => ",       sysPath.resolve(mockResp)     );     var respFunc = this.respFuncMap[actionKey];     var respTasks = [       function (seriesCallback) {         return respFunc(           mockResp,           {             req: req,             resp: resp,             rule: mockRule,             options: options,           },           seriesCallback         );       },     ];     return async.series(respTasks, function (err) {       if (err) {         return resp.end(err);       } else {         return resp.end();       }     });   },   getActionKey: function (mockResp) {     var extName = sysPath.extname(mockResp);     if (/https?:\/\//.test(mockResp)) {       return "proxy_pass";     } else {       switch (extName) {         case ".json":           return "raw";         case ".js":           return "action";         default:           return "raw";       }     }   },   doUpdate: function () {     var self = this;     var nowMs = new Date();     if (nowMs - this.lastCheckTime >= self.checkInterval) {       var checkFileStat = sysFs.statSync(self.mockConf);       if (checkFileStat.mtime !== self.mockConfMtime) {         try {           var mockConfBuffer = {             module: {},           };           var content = sysFs.readFileSync(this.mockConf, dataEncoding);           jsVm.runInNewContext(content, mockConfBuffer);           var configObj = mockConfBuffer.module.exports;           var tmpRules = configObj.rules || [];           var tmpKey, tmpAction;           delete configObj.rules;           for (tmpKey in configObj) {             tmpAction = configObj[tmpKey];             tmpRules.push({               pattern: tmpKey,               responder: tmpAction,             });           }           self.mockRules = tmpRules;         } catch (e) {           console.log("mock配置文件出错:", e.toString());         }       }     }   },   getContent: function (relativePath) {     var dirname = sysPath.dirname(this.mockConf);     var filePath = sysPath.join(dirname, relativePath);     var targetPath;     if (sysFs.existsSync(filePath)) {       targetPath = filePath;     } else if (sysFs.existsSync(filePath + ".json")) {       targetPath = filePath + ".json";     } else if (sysFs.existsSync(filePath + ".js")) {       targetPath = filePath + ".js";     } else {       throw new Error("path:" + relativePath + " not exists");     }     return sysFs.readFileSync(targetPath, dataEncoding);   }, };
function noMock(req, resp, next) {   return next(); }
module.exports = function (options) {   var mockConf = options.mockConf;   if (mockConf) {     if (!sysFs.existsSync(mockConf)) {       console.log("mock 配置", mockConf, "不存在");       return noMock;     }   } else {     return noMock;   }   mockManager.init(mockConf);   return function (req, resp, next) {     mockManager.doUpdate();     var mockRule = mockManager.getMockRule(req.url, req.method.toUpperCase());     if (mockRule) {       return mockManager.doResponse(mockRule, req, resp, options);     } else {       return next();     }   }; };   3.建立mock配置文件 mock-conf.js module.exports = { /* 菜单数据mock 目标地址 : mock文件 for example:    "/moirai/user/getResource": "./test/getResource.js", */ };   4.在vue.config.js 或者 webpack的config文件中引入mock配置并使用 // 添加mock配置文件         before (app) {    // withMock 控制是否使用mock             if (withMock) {                 let mockPlugin = require('./mock/mockPlugin')                 app.use(mockPlugin({                   mockConf: './mock/mockConfig.js'                 }))                 console.log('\n本地 mock 加载成功!\n')               }         }  

标签:function,return,resp,req,添加,var,方法,mock
From: https://www.cnblogs.com/jackdongdong/p/17996581

相关文章

  • Python导入torch包的方法
    原文链接:https://blog.csdn.net/weixin_57775672/article/details/128527024前言随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容中下载torch包遇见的一些问题和解决方法。一、Pythorch是什么?Pytorch是torch的pyt......
  • Visual Studio部署C++矩阵库Armadillo的方法
      本文介绍在VisualStudio软件中配置C++环境下线性代数运算库Armadillo的方法。  首先,我们需要在Armadillo库官网下载其源代码,直接点击下图所示红色框内部分即可。  点击上图所示位置后,将弹出一个新的下载界面;Armadillo库的源代码将随后自动下载。  接下来,我们在Vis......
  • Shell 覆写文件以及追加内容方法
    平常开发时,在没有窗口的情况下,有时候调试看不到打印信息,就想把log写入一个临时文件中,但老是分不太清shell写入文件哪个是覆盖哪个是追加,这里记录一下。覆写文件内容需要将文件内容覆盖时,使用>指向目标文件追加文件内容需要在文件末尾追加内容时,使用>>指向目标文件代码......
  • mybatis 传递参数的7种方法
     文章目录1.第一种方式匿名参数顺序传递参数2.第二种方式使用@Param注解3.使用Map传递参数4.用过javabean传递多个参数5.直接使用JSON传递参数6.传递集合类型参数List、Set、Array7.参数类型为对象+集合在实际开发过程中,增删改查操作都要涉及到请求参数的传递,今天这节就集......
  • 无涯教程-ExpressJS - HTTP方法
    请求中提供了HTTP方法,该方法指定了客户端已请求的操作。下表列出了最常用的HTTP方法-S.No.Method&Remark1GETGET方法用于获取数据2POSTPOST方法用于提交数据3PUTPUT方法用于修改数据4DELETEDELETE方法用于删除数据GETMethodGET请求通过在请求的URL部......
  • windows下的redis未授权访问修复方法
    在windows服务中查看redis服务的启动参数,先停止此服务修改redis.windows.conf这个文件1.为Redis添加密码验证(重启redis才能生效)添加或修改以下行 requirepassmypassword其中yourpassword是你设置的强密码。 2.禁止外网访问Redis(重启redis才能生效)  修改redi......
  • win11家庭版没有本地用户和组怎么办 win11家庭版没有本地用户和组解决方法
    https://www.xtzjcz.com/pc/247809.htmlwin11家庭版没有本地用户和组怎么办呢,当用户发现自己的win11的系统是家庭版本的时候并且没有本地用户和组的开启功能的话要怎么操作才能拥有呢,其实这个功能在win11上是有的只不过一般家庭版不让用,下面就是关于win11家庭版没有本地用户和组......
  • C#(10):传值,输出,引用,数组,具名,可选参数,拓展方法
    传值参数:被调用后并不会更改变量值,改变的是方法中传去的变量值副本,仅影响方法中的参数值,不影响变量本身的值变量以及参数指向的是地址,方法调用后参数中重新指向新对象地址,将原来引用的变量对象地址丢弃,重新创建新对象地址  getHashcode方法,获取内存中的对象的has......
  • 还在担心报表不好做?不用怕,试试这个方法
    前言在各种业务场景中,我们经常需要生成各种报表,例如学校中的学生成绩表、商业场景中的销售单和发票单、测量检测场景中的检测报告等等。这些报表对于组织和管理数据非常重要,因为它们提供了直观、清晰的方式来展示和分析数据。一般情况下,使用Excel设计和生成这些报表就可以,但是随......
  • 方法句柄API使用
    基本使用步骤第一步,构造要调用方法的MethodType,由返回值类型+参数列表类型组成。第二步,获取Lookup实例,一般使用MethodHandles类中提供的静态方法获取,最常用的MethodHandles.lookup()。第三步,调用Lookup实例的findXXX方法获取到MethodHandle,即方法句柄。主要有findConstructor......