mock.js 在 node.js 中无法拦截 http 请求,因其专为浏览器设计,依赖 window 对象劫持 xmlhttprequest/fetch;node 环境无 window,会报错或静默失败,需搭配 express/koa 手动路由并用 mock.mock() 生成数据。

直接用 Mock.js 在 Node.js 里启动 mock 服务是行不通的——它根本不会拦截请求,require('mockjs') 后调 Mock.mock() 只生成数据,不接管 HTTP 流量。
为什么 Mock.js 在 Node.js 中 require 就报错或静默失败
Mock.js 的设计目标是浏览器环境:它通过重写 window.XMLHttpRequest 和 window.fetch 实现请求拦截。Node.js 没有 window 对象,所以运行时会抛 ReferenceError: window is not defined;即使你用 global.window = {} 临时补上,它依然无法劫持 Node 的 http 或 https 模块调用,前端发的请求照样打到真实后端。
常见误操作:
- 在
server.js里const Mock = require('mockjs')然后试图用它“代理接口” - 把
Mock.mock()返回值硬塞进res.json(),以为这就是 mock 服务——这只是静态假数据,不是可配置、可路由、可响应不同方法/参数的 mock 服务
真正能在 VSCode + Node 下跑起来的 mock 方案
你需要一个 HTTP 服务框架(如 express 或 koa),再配合数据生成工具(如 mockjs)或纯 JSON 文件,由你手动定义路由和响应逻辑。
推荐组合(轻量、调试友好、VSCode 原生支持):
- 用
express搭骨架,监听localhost:3000 - 用
mockjs的Mock.mock()函数生成结构化假数据(它此时只是个数据工厂,不依赖环境) - 每个路由对应一个
res.json(Mock.mock({...})),或读取./mock/user.json这类文件 - 加
cors中间件,避免前端跨域报错 - 用
nodemon监控文件变化,保存即重启
示例 server.js 片段:
const express = require('express');
const cors = require('cors');
const Mock = require('mockjs');
const app = express();
app.use(cors());
app.get('/api/users', (req, res) => {
res.json(Mock.mock({ 'list|5': [{ 'id|+1': 1, 'name': '@cname', 'email': '@email' }] }));
});
app.listen(3000, () => console.log('Mock server running on http://localhost:3000'));
VSCode 终端里启动和调试的关键细节
确保你在系统级终端(非仅 VSCode 内置终端)验证过 node -v 和 npm -v 成功,否则 nodemon 可能找不到 node 运行时。
启动命令建议:
- 开发时:运行
npm run dev,对应"dev": "nodemon server.js"(需先npm install nodemon --save-dev) - 调试时:别直接按 F5 跑
server.js—— 默认 launch 配置不带--inspect-brk,断点可能不生效;改用 attach 模式:先终端执行nodemon --inspect-brk server.js,再在launch.json中配"type": "node","request": "attach","port": 9229 - 路径别含中文或空格,尤其 Windows 下,否则
require可能静默失败
最易被忽略的一点:mock 接口地址必须和前端代码里写的 URL 完全一致(包括协议、host、path),否则前端发不出请求或跨域失败——不要指望 Mock.js 自动帮你“替换域名”,那是构建工具(如 vite 的 server.proxy)或反向代理干的事,不是 mock 服务本身的职责。











