安装 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. Mockito入门:如何在Spring中Mock部分对象

    前情提要 随着分布式应用的开发逐渐成为标配,多个微服务团队合作来完成垂直业务的开发成为了一种常态.微服务使得团队可以专注于自己的业务逻辑,在和下游依赖和上游对接的团队聚焦好接口之后,就进入正式的开发. ...

  2. Qt开源作品33-图片开关控件

    一.前言 进入智能手机时代以来,各种各样的APP大行其道,手机上面的APP有很多流行的元素,开关按钮个人非常喜欢,手机QQ.360卫士.金山毒霸等,都有很多开关控制一些操作,在WINFORM项目上,如 ...

  3. vue-cli@4搭建 vue + element-ui 项目实操

    原文链接: vue-cli@4搭建 vue + element-ui 项目实操

  4. 【记录】使用R2 CDN替换本地项目图片以加速图片加载

    将图片存储到 Cloudflare 的存储桶中,并通过其提供的公共 URL 来替换代码中的本地路径,可以减小项目中打包的图片文件体积 实现方法的详细步骤: 1. 上传图片到 Cloudflare 的存 ...

  5. uwp IProgress<T>进度通知。

    主要是利用 Pp_ProgressChanged 报告进度: private void BtnDownload_Click(object sender, RoutedEventArgs e) { va ...

  6. C# Windows Media Player 播放playlist 歌单

    using AxWMPLib; using System; using System.Collections.Generic; using System.Linq; using System.Text ...

  7. ElasticSearch架构及详解

    1. 图解es内部机制 1.1. 图解es分布式基础 1.1.1es对复杂分布式机制的透明隐藏特性 分布式机制:分布式数据存储及共享. 分片机制:数据存储到哪个分片,副本数据写入. 集群发现机制:cl ...

  8. w3cschool-Apache Storm 教程

    https://www.w3cschool.cn/apache_storm/ Apache Storm教程Apache Storm简介Apache Storm核心概念Apache Storm集群架构A ...

  9. AlertWindowManager 弹出提示窗口

    LookAndFeel(界面外观): NativeStyle:本地化界面为真实用系统内置外观 SkinName:本地化界面(NativeStyle:)设置为假可使用皮肤外观 OptionAnimate ...

  10. 舞台已就位!坐等AI玩家集结!

    舞台已就位!坐等AI玩家集结!