[mockjs]-mockjs的使用

Mock主要是用于前后端分离时,模拟交互时的返回数据

接下来介绍一下其它几种Mock的方式

json-server 与 express

之前介绍过json-server,可以启动一个express创建的mock的服务,通过接口获取数据;json-server也可以通过命令直接启动一个json文件作为mock服务,但是json-server直接启动json文件有一个无法避免的缺点:如果我们将mock数据放到一个json文件中,并且一个json文件中存在多个接口的数据,此时是以根节点下的字段属性作为接口路径的,但是接口路径可能是多个/拼接而成,而字段属性是不支持设置复杂的路径的,所以使用起来没有那么方便

也介绍过express创建服务,直接返回数据,还介绍了express通过访问文件获取返回数据的方式

express与json-server的区别

  1. MOCK服务的创建:

    express直接创建mock服务;

    json-server是可以使用其内置的express创建的mock服务,此方式可以使用多样性的接口路径;

    json-server也可以使一个json文件成为mock服务,此方式接口路径受限

  2. 启动工具

    通过node启动express创建mock的服务

    node bin/index.js
    

    json-server 直接启动.json文件

    json-server db.json -p 3003 
    

    json-server 启动.js文件,文件中可以使用内置的express创建mock服务

    json-server bin/index.js
    

express与json-server的相同点

两者启动js或mjs等可执行文件时,都可以在文件中通过对应的方法读取其它数据文件,也可以直接在执行文件中直接设置返回参数

express示例

import express from "express";
import cors from "cors";
import bodyParser from "body-parser";
import path from "path";
import { fileURLToPath } from 'url';//node内置模块
//es6中不可以直接使用__dirname
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const app = express(),API_PATH = "/api",port = 8888;
app.use(cors({ origin: "*" })); // 允许跨域
app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
const router = express.Router();
//监听端口
app.listen(port, () => {//打印一下接口用例地址console.log(`测试读取数据地址:http://127.0.0.1:${port}${API_PATH}/`);
});//设置允许跨域访问
app.all("*", (req, res, next) => {const prefix="Access-Control-"res.header(prefix+"Allow-Origin", "*");res.header(prefix+"Allow-Headers", "*");res.header(prefix+"Allow-Methods", "*");// res.header("X-Powered-By", "http://www.shuzhiqiang.com");res.header("Content-Type", "application/json;charset=utf-8");res.header(prefix+"Allow-Credentials", true);//允许cookie跨域请求//防止在预请求阶段就响应接口req.method.toUpperCase() === "OPTIONS" ? res.sendStatus(200) : next();
});//添加接口 get、post
router.get('/search', function (req, res) {//获取请求的参数const param = req.body;//设置返回的数据res.json({mes: "info",resCode: 200,//1.直接设定任意返回值//2.读取文件获取到的处理值 均可data: {}});
});
//所有路由前添加API_PATH前缀
app.use(API_PATH, router);//增加数据

mockjs

mockjs是一个模拟返回数据的工具包

类型方法描述
BooleanRandom.boolean可以生成基本数据类型
NaturalRandom.natural(1, 100)生成1到100之间自然数
IntegerRandom.integer(1, 100)生成1到100之间的整数
FloatRandom.float(0, 100, 0, 5)生成0到100之间的浮点数,小数点后尾数为0到5位
CharacterRandom.character()生成随机字符串,可加参数定义规则
StringRandom.string(2, 10)生成2到10个字符之间的字符串
RangeRandom.range(0, 10, 2)生成一个随机数组
DateRandom.date()生成一个随机日期,可加参数定义日期格式
ImageRandom.image(Random.size, ‘#02adea’, ‘Hello’)Random.size表示将从size数据中任选一个数据
ColorRandom.color()生成一个颜色随机值
ParagraphRandom.paragraph(2, 5)生成2至5个句子的文本
NameRandom.name()生成姓名
UrlRandom.url()生成web地址
AddressRandom.province()生成地址

具体的其它支持api可到官网查看


设定索引自动增长
attrName|number:[]表明数组中的内容重复的次数;
假设数组中是1个项目,那么Mock后最终返回的是number个元素;
假设数组中是2个项目,那么Mock后最终返回的是2*number个元素;

attrName|+number:每次自动增加number;

{status: 200,msg: "get_info success",'data|100': [//attrName|number{'index|+1': 1,fileName: "XXPAB00",ddType: 1,clientIP: "10.26.2.22",edate: 1579741,chId: "11",amount: 0.0}]
};

设定交互的类型: get || post

Mock.mock(RegExp("/assign" + ".*"), 'post', assign);
Mock.mock(RegExp("/group" + ".*"), "get", groups);

mockjs与express的结合应用

环境准备

npm i mockjs [-g]
npm i express [-g]

-g可选,表示全局安装,推荐项目级安装,方便以后的mock

创建mock.js

创建与src同级目录mock,创建mock.js文件

const express = require('express');   //引入express
const Mock = require('mockjs');       //引入mock
const app = express();        //实例化express
app.use('/login', function (req, res) {res.json(Mock.mock({'resCode|1': ['200', '100005', '100003'],'resMessage|1': ['角色精湛主题略荒诞', '疑信参半却无比期盼'],'data|1': [{'key|+1': 1,'maskedIdNo|1': ['123sss0', '12300', '12348900'],'maskedMobile|1': ['13820112810', '12345678900'],'personId|1': ['234788', '147258', '256987']}]}))
})
//IP :127.0.0.1 是本地IP地址 
app.listen('8099', () => {console.log('监听端口 8099:http://127.0.0.1:8099/')
})

添加启动命令

添加"mock": “node mock/mock.js”

"scripts": {"start": "node scripts/start.js","build": "node scripts/build.js","test": "node scripts/test.js","mock": "node mock/mock.js"
}

调试

启动运行

刷新npm工具栏,双击mock
webstorm 与 vscode都支持npm脚本的界面化操作,如下图

webstorm:

在这里插入图片描述

vscode:
在这里插入图片描述

报错问题

因为启动的项目与启动的mock数据服务器端口号不同,因此存在跨域,导致报错
在这里插入图片描述

mock.js添加允许跨域内容

app.use(function(req, res, next) {res.header("Access-Control-Allow-Origin", "*");res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');res.header("Access-Control-Allow-Headers", "X-Requested-With");res.header('Access-Control-Allow-Headers', 'Content-Type');next();
});

重新启动,发现仍旧报错
在这里插入图片描述

Access to XMLHttpRequest at 'http://localhost:8099/login?idNo=35012&captcha=' from origin 'http://localhost:3000' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

感觉是axios安全设置导致,发现存在设置

axios.defaults.withCredentials = true;// 表示跨域请求时是否需要使用凭证

注释该语句,刷新,重新请求,该问题解决


完整mock.js

let express = require('express');   //引入express
let Mock = require('mockjs');       //引入mock
let app = express();        //实例化expressapp.use(function(req, res, next) {res.header("Access-Control-Allow-Origin", "*");res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');res.header("Access-Control-Allow-Headers", "X-Requested-With");res.header('Access-Control-Allow-Headers', 'Content-Type');next();
});app.use('/login',function(req, res){res.json(Mock.mock({'resCode|1': ['200','100005','100003'],'resMessage|1':['角色略荒诞', '理由人不安',],'data|1':[{'key|+1': 1,'maskedIdNo|1':['1234567890sss0','12345fff678900','12345888678900'],'maskedMobile|1': ['13820112810', '12345678900', '78945612301'],'personId|1': ['234788', '256987']}]}))
})
// http://127.0.0.1:8090/user.png
app.use(express.static("./assets"));//http://127.0.0.1:8090/assets/user.png
//注意,拼接路径,前段是"/assets",不是"assets",否则静态资源可能显示不出来
//可以访问assets文件夹下所有的静态资源
app.use("/assets", express.static("./assets"));//IP :127.0.0.1 是本地IP地址 
app.listen('8099', () => {console.log('监听端口 8099:http://127.0.0.1:8099/')
})

直接使用mockjs

创建mock.js文件

import Mock from 'mockjs' // 引入mockjsconst Random = Mock.Random // Random 用于生成各种随机数据let data = [] // 用于接受生成数据的数组
let size = ['300x250', '250x250', '240x400', '336x280', '180x150', '720x300', '468x60', '234x60', '88x31', '120x90', '120x60', '120x240', '125x125', '728x90', '160x600', '120x600', '300x600'] // 定义随机值
for(let i = 0; i < 10; i ++) { // 可自定义生成的个数let template = {'Boolean': Random.boolean, // 可以生成基本数据类型'Natural': Random.natural(1, 10), // 生成1到10之间自然数'Integer': Random.integer(1, 100), // 生成1到100之间的整数'Float': Random.float(0, 100, 0, 5), // 生成0到100之间的浮点数,小数点后尾数为0到5位'Character': Random.character(), // 生成随机字符串,可加参数定义规则'String': Random.string(2, 10), // 生成2到10个字符之间的字符串'Range': Random.range(0, 10, 2), // 生成一个随机数组'Date': Random.date(), // 生成一个随机日期,可加参数定义日期格式'Image': Random.image(Random.size, '#02adea', 'Hello'), // Random.size表示将从size数据中任选一个数据'Color': Random.color(), // 生成一个颜色随机值'Paragraph':Random.paragraph(2, 5), //生成2至5个句子的文本'Name': Random.name(), // 生成姓名'Url': Random.url(), // 生成web地址'Address': Random.province() // 生成地址}data.push(template)
}
// 根据数据模板生成模拟数据
Mock.mock('/data/index', 'post', data) 

存在问题

如果存在接口是另外一个接口的一部分,例如:

const api1=/dd/result;

const api2=/dd/result/history;

Mock.mock(RegExp(api1 + ".*"), "get", tpT);
Mock.mock(RegExp(api2 + ".*"), "get", detail);

调用接口api2时,因为两个Mock规则都符合要求,因此Mock文件会返回第一个符合要求的Mock结果,也就是如果是api1在前,api2在后,调用接口api2时,返回的是tpT,而应该返回的是detail!!!!!

那么如何解决该问题?!!在接口名称无法改变的情况下,这种问题可以通过调整Mock接口的顺序来解决,先拦截比较独特的接口:

Mock.mock(RegExp(api2 + ".*"), "get", detail);
Mock.mock(RegExp(api1 + ".*"), "get", tpT);

此时访问接口api2时,两个Mock规则都符合要求,但是返回第一个符合要求的Mock规则结果,访问接口api1,返回的是detail

使用方法

在启动的项目中直接引入 mock.js 的文件,不需要使用命令启动等就可以直接使用该mock了

例如,在main.ts等入口文件中引入该文件:

const MOCK_DATA = (flag) => {if (flag) {require('@/config/mock')}
}

可以根据条件决定是否引入mock文件,一旦被引入,发生接口调用的时候会直接返回MOCK数据,不引入mock文件的时候会调用真正的接口

直接使用与结合使用的区别

直接使用的方式决定了,该方式是当前项目级别的,其它项目不能使用该项目中的Mock;

而与express结合的方式,是单独启动的服务,当然也可以单独作为一个项目,因此,可以被其它项目调用的;

所以如果是不需要被公用的Mock,推荐直接使用,方便,并且不需要额外引入包;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/134233.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DS相关题目

DS相关题目 题目一&#xff1a;消失的数字 拿到这道题目之后&#xff0c;首先可以想到的一个解题方法就是&#xff0c;我们可以先排序&#xff0c;排完序之后&#xff0c;这个数组其实就是一个有序的数组了&#xff0c;那只用比较数组中的每一个元素和他对应的下标是不是相等的…

element+vue table上移+下移 拖拽

//安装 npm install sortablejs --save<el-table :data"statisticsChexkboxs" border max-height"300px" width"740px" row-key"id"ref"projectTable"><el-table-column v-for"item in confirmHead" :ke…

开源库源码分析:OkHttp源码分析(二)

开源库源码分析&#xff1a;OkHttp源码分析&#xff08;二&#xff09; 导言 上一篇文章中我们已经分析到了OkHttp对于网络请求采取了责任链模式&#xff0c;所谓责任链模式就是有多个对象都有机会处理请求&#xff0c;从而避免请求发送者和接收者之间的紧密耦合关系。这篇文章…

网络基础-应用层协议-HTTP/HTTPS

HTTP/HTTPS HTTP基本概念协议格式请求报文请求方法请求资源地址协议版本 应答报文 常见Header常见状态码与状态描述Cookie&Sessionhttp协议特点 HTTPS基本概念对称加密与非对称加密数据摘要&数据指纹HTTPS工作过程探究只采用对称加密只采用非对称加密双方都采用非对称加…

QT : 仿照QQ 完成弹出登录窗口,并实例化组件

1. 运行效果图 2. Headers #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow(); }; #endif // MAINWINDOW_H 3. mainWindow.cpp &#xff1a…

计算机竞赛 机器视觉目标检测 - opencv 深度学习

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…

初识Java 9-1 内部类

目录 创建内部类 到外部类的链接 使用.this和.new 内部类和向上转型 在方法和作用域中的内部类 匿名内部类 嵌套类 接口中的类 从多嵌套的内部类中访问外部人员 本笔记参考自&#xff1a; 《On Java 中文版》 定义在另一个类中的类称为内部类。利用内部类&#xff0c;…

C++qt day8

1.用代码实现简单的图形化界面&#xff08;并将工程文件注释&#xff09; 头文件 #ifndef MYWIDGET_H #define MYWIDGET_H //防止头文件冲突#include <QWidget> //父类的头文件class MyWidget : public QWidget //自定义自己的界面类&#xff0c;公共继承…

性能测试 —— Jmeter事务控制器

事务&#xff1a; 性能测试中&#xff0c;事务指的是从端到端&#xff0c;一个完整的操作过程&#xff0c;比如一次登录、一次 筛选条件查询&#xff0c;一次支付等&#xff1b;技术上讲&#xff1a;事务就是由1个或多个请求组成的 事务控制器 事务控制器类似简单控制器&…

页面静态化、Freemarker入门

页面静态化介绍 页面的访问量比较大时&#xff0c;就会对数据库造成了很大的访问压力&#xff0c;并且数据库中的数据变化频率并不高。 那需要通过什么方法为数据库减压并提高系统运行性能呢&#xff1f;答案就是页面静态化。页面静态化其实就是将原来的动态网页(例如通过ajax…

ES6中新增加的Proxy对象及其使用方式

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Proxy对象的基本概念Proxy对象的主要陷阱&#xff08;Traps&#xff09; ⭐ 使用Proxy对象⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来…

八、硬改之设备画像

系列文章目录 第一章 安卓aosp源码编译环境搭建 第二章 手机硬件参数介绍和校验算法 第三章 修改安卓aosp代码更改硬件参数 第四章 编译定制rom并刷机实现硬改(一) 第五章 编译定制rom并刷机实现硬改(二) 第六章 不root不magisk不xposed lsposed frida原生修改定位 第七章 安卓…

听GPT 讲Istio源代码--istioctl

在 Istio 项目的 istioctl 目录中&#xff0c;有一些子目录&#xff0c;每个目录都有不同的作用和功能。以下是这些子目录的详细介绍&#xff1a; /pkg: pkg 目录包含了 istioctl 工具的核心代码和库。这些代码和库提供了与 Istio 控制平面交互的功能&#xff0c;例如获取和修改…

Linux 安装 cuda

【存在问题】 有时候Ubuntu它自己会自动更新&#xff0c;使得之前能用得torch都用不了了。 输入nvidia-smi时&#xff0c;报错如下&#xff1a; NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is…

PowerDesigner 逆向工程以及IDEA中UML插件

1、MySQL数据库连接&#xff08;JDBC方式&#xff09; 1.1 新建一个pdm&#xff0c;dbms选择mysql 1.2 Database - Connect 选择数据库连接 1.3 配置连接信息 数据库连接这里是通过一个配置文件来获取连接信息的&#xff0c;首次的话因为没有&#xff0c;所以我们需要选择…

什么是MQ消息队列及四大主流MQ的优缺点(个人网站复习搬运)

什么是&#xff2d;&#xff31;消息队列及四大主流&#xff2d;&#xff31;的优缺点 小程序要上一个限时活动模块&#xff0c;需要有延时队列&#xff0c;从网上了解到用RabbitMQ可以解决&#xff0c;就了解了下 MQ 并以此做记录。 一、为什么要用 MQ 核心就是解耦、异步和…

Zabbix监控部署项目

为什么选择Zabbix Zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix 能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 面试常问 你用过哪些监控软件 zabbix …

Python用正则化Lasso、岭回归预测房价、随机森林交叉验证鸢尾花数据可视化2案例|数据分享...

全文链接&#xff1a;https://tecdat.cn/?p33632 机器学习模型的表现不佳通常是由于过度拟合或欠拟合引起的&#xff0c;我们将重点关注客户经常遇到的过拟合情况&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 相关视频 过度拟合是指学习的假设在训练数据上…

MySQL数据库upsert使用

本文翻译自&#xff1a;MySQL UPSERT - javatpoint&#xff0c;并附带自己的一些理解和使用经验. MySQL UPSERT UPSERT是数据库管理系统管理数据库的基本功能之一&#xff0c;它允许数据库操作语言在表中插入一条新的数据或更新已有的数据。UPSERT是一个原子操作&#xff0c;…

git 远程名称 远程分支 介绍

原文&#xff1a; 开发者社区> 越前君> 细读 Git | 让你弄懂 origin、HEAD、FETCH_HEAD 相关内容 读书笔记&#xff1a;担心大佬文章搬家&#xff0c;故整理此学习笔记 远程名称&#xff08;Remote Name&#xff09; Origin 1、 origin 只是远程仓库的一个名称&#xff…