[mockjs]-mockjs的使用

news2024/10/7 14:23:45

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();        //实例化express

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();
});

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' // 引入mockjs
 
const 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.coloradmin.cn/o/1017557.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】大模型卷到机器人上了

当一项变革性技术出现后&#xff0c;以此为基础的技术就会像雨后春笋般蔓延。 就像Transformer出现后&#xff0c;以此为基础的大语言模型ChatGPT&#xff0c;视觉基础模型Segment Anything相继横空出世&#xff0c;并展现出强大的涌现能力。生成式AI可谓百花齐鸣&#xff0c;…

性能测试-性能工程落地的4个阶段(21)

性能工程按照不同的内容和目的划分为4个阶段,分别是线下单系统压测分析阶段、线下全链路压测分析阶段、生产只读业务压测及容量评估阶段、生产读写业务全链路压测及容量评估阶段。(也可以理解为一个企业性能测试体系的发展阶段) 线下单系统压测分析阶段 针对单系统的性能…

那些你不得不知道的CSS知识点

目录 1、CSS的盒子模型1.1 css盒子模型有哪些&#xff1a;1.2 css盒子模型的区别1.3 通过css如何转换css盒子模型 2、css优先级3、line-height和height的区别4、如果用css画一个三角形&#xff1f;5、CSS选择符有哪些&#xff1f;哪些属性可以继承&#xff1f;6、一个盒子不给宽…

《已解决 Go Error: panic: runtime error: index out of range BUG 》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e; 猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f4a1; 后端技术 Backend: 编程语言: &#…

【计算机视觉】Image Data Augmentation算法介绍合集(二)

文章目录 一、Random Grayscale二、GridMask三、Adversarial Color Enhancement四、Population Based Augmentation五、MaxUp六、SuperpixelGridCut, SuperpixelGridMean, SuperpixelGridMix七、InstaBoost八、Random Mix-up九、Sample Redistribution十、Batchboost十一、CutB…

人工智能前景如何?人工智能所对应到企业中是什么样的岗位呢?

目录 分布式计算在硕士阶段主要是在干什么呢&#xff0c;主要修的课程是些什么呢&#xff1f; 分布式计算所对应到企业中是什么样的岗位呢&#xff1f; 分布式计算前景如何&#xff1f; 人工智能在硕士阶段主要是在干什么呢&#xff0c;主要修的课程是些什么呢&#xff1f;…

vue国际化教程

需求背景 项目需求要做国际化&#xff0c;结果网上找了好几篇文章&#xff0c;没有一个可以一次性搞定&#xff0c;现在这里总结一下。首先&#xff0c;我们分为两部分处理&#xff0c;一个是前端页面的静态文字&#xff0c;这个由前端vue.json自行处理。第二部分就是后端的错…

基于springboot漫画管理系统springboot001

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

vue+element-ui el-descriptions 详情渲染组件二次封装(Vue项目)

目录 1、需求 2.想要的效果就是由图一变成图二 ​编辑 3.组件集成了以下功能 4.参数配置 示例代码 参数说明 5,组件 6.页面使用 1、需求 一般后台管理系统&#xff0c;通常页面都有增删改查&#xff1b;而查不外乎就是渲染新增/修改的数据&#xff08;由输入框变成输…

十四、流式编程(2)

本章概要 中间操作 跟踪和调试流元素排序移除元素应用函数到元素在 map() 中组合流 中间操作 中间操作用于从一个流中获取对象&#xff0c;并将对象作为另一个流从后端输出&#xff0c;以连接到其他操作。 跟踪和调试 peek() 操作的目的是帮助调试。它允许你无修改地查看…

CMU 15-445 Project #3 - Query Execution(Task #1、Task #2)

文章目录 一、题目链接二、准备工作三、SQL 语句执行流程四、BusTub 表结构五、Task #1 - Access Method Executors5.1 顺序扫描执行器5.2 插入执行器5.3 删除执行器5.4 索引扫描执行器 六、Task #2 - Aggregation & Join Executors6.1 聚合执行器6.2 循环连接执行器6.3 索…

设计模式Java实战

文章目录 一、前置1.1 目的1.2 面向对象1.3 接口和抽象类 二、七大设计原则2.1 单一职责2.2 接口隔离原则2.3 依赖倒转原则2.4 里氏替换原则2.5 开闭原则2.6 不要重复原则2.7 迪米特最少知道法则 三、23种设计模式3.1创建型&#xff1a;创建对象3.1.1 单例模式定义最佳实践场景…

【基础篇】ClickHouse 表引擎之集成Kafka

文章目录 0.前言1.集成示例官方教程示例1&#xff1a;示例2&#xff1a;配置Kerberos 支持 虚拟列 参考文档 0.前言 ClickHouse为了方便与Kafka集成&#xff0c;提供了一个名为Kafka引擎的专用表引擎。Kafka引擎允许你在ClickHouse中创建一个表&#xff0c;这个表的数据源来自…

react的状态管理简单钩子方法

1.recoil useProvider文件: import { atom, useRecoilState } from recoil;const initState atom({key: initState,default: {state: [],}, })// 将业务逻辑拆分到一个单独文件中&#xff0c;方便进行状态管理 export interface StateProps {id: number;text: string;isFini…

学习Node js:raw-body模块源码解析

raw-body是什么 raw-body的主要功能是处理HTTP请求体的原始数据。它提供了以下核心功能&#xff1a; 解析请求体&#xff1a;可以从HTTP请求中提取原始数据&#xff0c;包括文本和二进制数据。配置选项&#xff1a;通过配置项&#xff0c;可以设置请求体的大小限制、编码方式…

主题教育活动知识竞赛小程序界面分享

主题教育活动知识竞赛小程序界面分享

Git - Git 工作流程

文章目录 Git WorkFlow图解小结 Git WorkFlow Git Flow是一种基于Git的工作流程&#xff0c;确实利用了Git作为分布式版本控制系统的优势。 本地代码库 (Local Repository): 每个开发者都维护自己的本地代码库&#xff0c;这是Git分布式性质的体现。本地代码库包含了完整的项目…

清华发力了,EUV光刻机技术取得重大突破,外媒:没想到如此快

日前媒体纷纷传言清华研发成功EUV光刻机&#xff0c;这个其实夸大了事实&#xff0c;不过却也确实是EUV光刻机的重大突破&#xff0c;将绕开ASML等西方垄断的EUV光刻技术路线&#xff0c;开辟一条全新的道路。 据了解清华研发成功的并非是EUV光刻机&#xff0c;而是可用于EUV光…

输入M*N阶矩阵A和B,用函数编程计算并输出A与B之和

#include<stdio.h> #define M 2 #define N 3 void scanfjuzhen(int arr[M][N])//向二维数组输入数据 {int i 0;int j 0;for (i 0; i < M; i){for (j 0; j < N; j)scanf("%d", &arr[i][j]);} } void sumjuzhen(int a[M][N], int b[M][N],int c[M]…

性能测试 —— Jmeter 常用三种定时器

1、同步定时器 位置&#xff1a;HTTP请求->定时器->Synchronizing Timer 当需要进行大量用户的并发测试时&#xff0c;为了让用户能真正的同时执行&#xff0c;添加同步定时器&#xff0c;用户阻塞线程&#xff0c;知道线程数达到预先配置的数值&#xff0c;才开始执行…