安装 mockj

首先确保你有一个 vue 2 项目,如果没有,可以用 Vue CLI 创建一个:

vue create vue-mock-demo

开始安装 Mock.js

npm install mockjs --save-dev

创建 Mock 配置文件

在项目的 src 目录下新建一个文件夹 mock,并在其中创建 index.js 文件,用于编写模拟接口。

例如(src/mock/index.js):

import Mock from "mockjs";

// 设置延迟响应时间(可选)
Mock.setup({
timeout: "200-600", // 模拟请求延迟 200ms 至 600ms
}); // 模拟接口返回数据
Mock.mock("/api/user", "get", {
code: 200,
message: "success",
data: {
"id|1-100": 1, // 生成一个 1 到 100 的随机数
name: "@cname", // 生成一个中文姓名
age: "@integer(20, 50)", // 生成 20 至 50 的随机整数
email: "@email", // 生成随机邮箱
},
}); Mock.mock("/api/products", "post", {
code: 200,
message: "success",
data: {
"list|5-10": [
{
"id|+1": 1, // 自增 ID
name: "@ctitle(5, 10)", // 生成 5-10 字的中文标题
price: "@float(100, 500, 2, 2)", // 生成价格,保留两位小数
},
],
},
}); // 你可以在这里添加更多 Mock 接口
console.log("Mock server is running..."); // 捕获所有请求 post、get指定
Mock.mock(/.*/, "get", (options) => {
console.log("Mock intercepted:", options);
return { code: 200, message: "Mock fallback response" };
});

在项目中引入 Mock 配置

为了让 Mock.js 生效,需要在项目的入口文件中引入 mock/index.js 文件。

修改 main.js , 在 src/main.js 中引入:

import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store"; // 引入 Mock 配置(仅在开发环境中引入)
if (process.env.NODE_ENV === "development") {
require("./mock");
} Vue.config.productionTip = false; new Vue({
router,
store,
render: (h) => h(App),
}).$mount("#app");

这样,Mock 功能只会在开发环境中生效,避免在生产环境中引入模拟数据。

调用接口

`app.vue` 配置如下代码:
<template>
<div>
<h1>User Info</h1>
<div v-if="user">
<p>ID: {{ user.id }}</p>
<p>Name: {{ user.name }}</p>
<p>Age: {{ user.age }}</p>
<p>Email: {{ user.email }}</p>
</div>
<button @click="fetchUser">Fetch User</button>
</div>
</template> <script>
import axios from "axios"; export default {
data() {
return {
user: null,
};
},
methods: {
async fetchUser() {
try {
const response = await axios.get("/api/user");
this.user = response.data.data;
} catch (error) {
console.error("Error fetching user:", error);
}
},
},
};
</script>

启动项目 npm run dev

打开浏览器,在页面中点击按钮可以看到从 /api/user 获取的模拟数据。

完成安装!!

Mock 配置

如果需要根据环境动态加载不同的 Mock 数据,可以将不同的 Mock 配置文件拆分为多个模块。例如:

  • mock/user.js:用户相关数据
  • mock/product.js:产品相关数据

然后在 mock/index.js 中统一引入。

import "./user";
import "./product";

development 关闭 mock

根据环境变量判断是否引入 Mock.js。使用 VUE_APP_USE_MOCK 环境变量来控制:

if (process.env.NODE_ENV === 'development' && process.env.VUE_APP_USE_MOCK === 'true') {
require('./mock'); // 引入 Mock 配置
}

在项目根目录下的 .env.development 文件中,添加以下行以开启 Mock.js

VUE_APP_USE_MOCK=true

如果需要关闭 Mock.js,只需将其设置为 false

mock错误排查和解决步骤

1. 确认 Mock 是否生效

在开发模式下,Mock.js 会拦截请求。首先确保 Mock.js 已正确加载并运行:

检查浏览器控制台是否打印了 Mock server is running...(或其他你在 mock/index.js 中定义的日志)。

确保入口文件 main.js 中的 require('./mock') 已被执行。

如果没有看到日志,说明 Mock.js 并未生效,请检查以下内容:

是否正确引入 mock/index.js,路径是否正确。

确保 mock/index.js 在开发环境下加载了。

2. 检查 Axios 的请求路径

Mock.js 默认拦截的是 相对路径 或完全匹配的请求路径。如果你的请求使用了完整的 URL 或者请求未被 Mock 拦截,那么请求会直接发送到实际后端。

Mock.js 的拦截规则:

例如,你在 mock/index.js 中定义了如下 Mock:

Mock.mock("/api/user", "get", { code: 200, message: "success" });

Mock.js 只会拦截 GET 请求到 /api/user 的路径。

排查 Axios 请求路径:

查看你的 axios 请求代码,是否包含了完整的 URL,例如:

axios.get("http://localhost:3000/api/user"); // 这种不会被 Mock.js 拦截

解决方案:将请求改为相对路径:

axios.get("/api/user"); // 这种会被 Mock.js 拦截

如果后端接口域名是必须的,可以使用环境变量区分开发和生产环境。例如,在开发环境中,移除基础 URL:

const instance = axios.create({
baseURL: process.env.NODE_ENV === "production" ? "http://your-api.com" : "", // 开发环境不加 baseURL
});

3. 确保 Mock.js 拦截功能未被覆盖

Mock.js 拦截请求的方式是通过 拦截 XMLHttpRequestFetch API 实现的。如果你的项目中有其他代码(例如 axios 配置了自定义的适配器)覆盖了 Mock.js 的拦截功能,Mock 就无法生效。

排查方式:

确认是否在 axios 中配置了自定义适配器:

axios.defaults.adapter = customAdapter; // 如果有这种代码,Mock.js 会失效

检查是否引入了其他拦截器(例如 msw 或其他数据模拟工具),可能会和 Mock.js 冲突。

解决方案:

  • 去掉自定义适配器或其他拦截工具。
  • 如果必须使用其他工具,考虑将 Mock.js 替换为更灵活的解决方案,例如 msw。

4. 确保请求路径和 Mock.js 拦截的路径匹配

Mock.js 的路径匹配是严格的,以下几点需要注意:

  • 请求方法是否匹配:

    如果你定义的是 Mock.mock("/api/user", "get", {...}),但你发送的是 POST 请求,Mock.js 不会拦截。

  • 请求路径是否完全一致:

    比如你定义了 /api/user,但实际请求是 /api/user//api/v1/user,Mock.js 不会拦截。

检查方法:

Mock.js 中定义一个通用拦截规则来捕获所有请求,并查看是否有未匹配的请求:

Mock.mock(/.*/, "get", (options) => {
console.log("Mock intercepted:", options);
return { code: 200, message: "Mock fallback response" };
});

通过这种方式,你可以查看 Mock.js 是否拦截了请求。如果请求没有被拦截,可能是路径或方法不匹配的问题。

5. 确保 Mock.js 只在开发环境中运行

Mock.js 的引入通常只在开发模式下生效。如果你通过 process.env.NODE_ENV 控制 Mock.js 是否加载,确保 NODE_ENV 的值在开发环境中是 "development"

if (process.env.NODE_ENV === "development") {
require("./mock");
}

排查方法:

打印环境变量,确保开发环境的值是 development

console.log("Current NODE_ENV:", process.env.NODE_ENV);

6. 使用 Mock.js 的 xhr 调试功能

Mock.js 提供了一个调试功能,可以帮助排查问题。在浏览器控制台中输入以下代码:

console.log(Mock.XHR.prototype.open.toString());

Mock.js 会打印自己的拦截逻辑。如果你看到的是原生的 XMLHttpRequest.open 方法,说明 Mock.js 的拦截功能没有生效。

7. 检查是否使用了现代 Fetch

Mock.js 默认是拦截 XMLHttpRequest 的请求。如果你使用的是 Fetch API,则需要额外引入 mockjs-fetch 插件来支持拦截 Fetch 请求。

安装 mockjs-fetch

npm install mockjs-fetch --save-dev

mock/index.js 中引入:

require("mockjs-fetch");

Mock.mock("/api/user", "get", { code: 200, message: "success" });

8. 检查是否使用了代理服务器

在开发环境中,有些项目会配置代理转发(例如 vue.config.js 中的 devServer.proxy),导致请求被代理转发到实际后端,而不是被 Mock.js 拦截。

排查方式:

检查 vue.config.js 中是否有类似的配置:

module.exports = {
devServer: {
proxy: {
"/api": {
target: "http://localhost:3000",
changeOrigin: true,
},
},
},
};

解决方案:

  • 在开发阶段禁用代理,或者将 Mock.js 的路径调整为非代理路径。
  • 确保代理只在需要时生效。

vue2 配置 mock.js 模拟后端数据的更多相关文章

  1. mock.js模拟ajax数据请求

    在我们开发过程中存在着前端页面ui完成了,但是没有接口进行联调数据的情况,现在介绍一下用mock.js来完成数据的请求.这样在后期我们的后台接口完成后只需要更改请求的接口名字即可!前提是你的模拟字段名 ...

  2. vue中使用axios(异步请求)和mock.js 模拟虚假数据

    一.使用axios 1.安装 npm install --save axios 2.引用 import Axios from 'axios' Vue.prototype.Axios = Axios 二 ...

  3. dva框架使用mock.js模拟数据 + fetch请求数据

    what DVA? Dva是基于Redux做了一层封装,对于React的state管理,有很多方案,我选择了轻量.简单的Dva. dva 可以很方便就使用mock.js进行数据的模拟. 只需要三步,即 ...

  4. Vue+Mock.js模拟登录和表格的增删改查

    有三类人不适合此篇文章: "喜欢站在道德制高点的圣母婊" -- 适合去教堂 "无理取闹的键盘侠" -- 国际新闻版块欢迎你去 "有一定基础但又喜欢逼逼 ...

  5. Charles——前端必备模拟后端数据

    Charles--前端必备模拟后端数据 现在都是前后端分离开发了,前端开发者经常会遇到一个问题如何模拟后端数据来进行开发调试,在这里给大家介绍一个前端神器--Charles. 安装 安装就不赘述了,直 ...

  6. axios + mock.js模拟数据实现前后端分离开发的实例代码

    首先就是必须安装axios和mock.js npm install axios npm install mockjs 1. 然后在文档src中新建一个mock.js文件,如图 2. 在main.js中 ...

  7. Vue笔记:使用 mock.js 模拟数据

    在我们的项目实际开发过程中,后端的接口往往是较晚才会提供出来,并且还要写接口文档,如果前端的开发都要等到接口开发完成才开始就非常影响项目整体开发进度了,mock.js 的出现使前后端分离并行开发成为可 ...

  8. mock.js 模拟数据

    1. 劫持请求,返回模拟数据: 用于前后台对接前数据模拟 相比于静态json文件而言:代码完成后不必修改源文件对应的接口调用.可模拟增删改查 2.实例代码 <!doctype html> ...

  9. Mock(模拟后端接口数据)配合Vuex的使用

    1.下载Mock  cnpm install Mockjs -S 2.新建一个data.js存放新生成的mock文件 编辑mock  并导出 const Mock = require('mockjs' ...

  10. mock.js模拟生成假数据

    mock使用方法很简单, 下面是简单的用法, 详细的用法可以看官方文档, 写的很清楚, 下面的代码直接拷贝到本地html文件, 双击打开即可生成你想要的数据 <!DOCTYPE html> ...

随机推荐

  1. Qt音视频开发32-qmedia内核回调拿图片数据

    一.前言 使用qmediaplayer来打开视频并播放,默认首选会采用QVideoWidget控件来展示,优点是不用自己来绘制,一切交给了QVideoWidget控件,这样可以做到极低的CPU占用,缺 ...

  2. 使用Docker编译PaddlePaddle

    在ubuntu中使用Docker编译PaddlePaddle 要在ubuntu中使用docker编译paddle框架,首先分为以下几个步骤: 安装docker环境 拉取paddle的docker镜像 ...

  3. SQL优化——深分页&排序

    问题背景 在开发 Web 应用或处理数据库查询时,分页是一项常见需求.然而,当面对深度分页(即页码较大,偏移量较高的分页情况)时,性能问题往往接踵而至.比如对一些需要拉特定的页面查询.范围导出.范围计 ...

  4. torque提交作业

    PBS(Protable Batch System)是功能最为齐全,历史最悠久,支持最广泛的本地集群调度器之一. PBS的目前包括openPBS,PBS Pro和Torque三个主要分支.其中Open ...

  5. Mysql身份认证过程

    背景 最近有一些hersql的用户希望能支持mysql的caching_sha2_password认证方式,caching_sha2_password与常用的mysql_native_password ...

  6. SpringMvc-初识

    ---------------------------------------------------------------- 1.环境搭建 1.1 jar包 <spring.version& ...

  7. 数据同步工具-DataX

    1.DataX 基本介绍 DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具,致力于实现包括:关系型数据库(MySQL.Oracle等).HDFS.Hive.HBase.ODPS.FTP等各种异 ...

  8. String、StringBuffer、StringBuilder三者的异同

    /*String.StringBuffer.StringBuilder三者的异同?String:不可变的字符序列:底层使用char[]存储StringBuffer:可变的字符序列:线程安全的,效率低: ...

  9. thewall靶机

    includes.php 内有文件读取漏洞 一开始是想着直接用为协议写入一句话木马但是后来发现不行 因为他的文件读取方式长这样 点击查看代码 <?php include ('/var/www/h ...

  10. h5按需引入Vant

    下载按需引入插件(推荐) babel-plugin-import 是一款 babel 插件, 它会在编译过程中将 import 的写法自动转换为按需引入的方式 # 安装插件 npm i babel-p ...