express 只需一个 server.js 文件即可启动,但必须正确配置中间件(如 express.json)、处理跨域(动态设置 access-control-allow-origin)、使用 nodemon 热重载,并在路由中调用 mock.js 动态生成数据。

直接用 Express 写个 server.js 就能跑起来
不需要框架、不用 CLI 工具,一个 server.js 文件 + express 就够了。很多教程硬推 express-generator 或 json-server,反而掩盖了最轻量的路径。
常见错误现象:启动后访问 http://localhost:3000/api/user 返回 404,但代码里明明写了 app.get('/api/user', ...) —— 很可能是没加 app.use(express.json()) 和 app.use(express.urlencoded({ extended: true })),导致 POST/PUT 请求体解析失败,连带 GET 路由注册也可能被中间件顺序干扰。
- 初始化项目:
npm init -y,然后npm install express - 新建
server.js,内容至少包含:const express = require('express'); const app = express(); app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.get('/api/user', (req, res) => res.json({ id: 1, name: 'mock-user' })); app.listen(3000, () => console.log('MockServer running on http://localhost:3000')); - VSCode 终端执行
node server.js即可,不用装额外插件或配置 launch.json
跨域问题必须手动处理,不能写 Access-Control-Allow-Origin: *
浏览器报错 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’ 是高频坑。你前端用了 fetch(..., { credentials: 'include' }) 或 axios 默认带 cookie,服务端却返回 *,浏览器直接拦截。
正确做法是动态读取请求头的 Origin 并回传,同时显式开启 credentials:
- 加中间件(放在所有路由前):
app.use((req, res, next) => { const origin = req.headers.origin; if (origin) { res.header('Access-Control-Allow-Origin', origin); res.header('Access-Control-Allow-Credentials', 'true'); } res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); if (req.method === 'OPTIONS') { res.sendStatus(200); } else { next(); } }); - 不要用第三方
cors包——它默认开*,除非你显式传入{ origin: true, credentials: true }
改代码后不想手动重启?nodemon 是唯一靠谱方案
VSCode 自带终端支持 Ctrl+C 停止进程,但每次改完 server.js 都要重敲 node server.js 属实低效。有人试过文件监视插件或 Live Server,但它们只监听静态资源,对 Node 后端无效。
必须用 nodemon,且注意安装方式:
- 全局装(推荐):
npm install -g nodemon,之后直接nodemon server.js - 局部装也行,但得写 script:
"scripts": { "mock": "nodemon server.js" },然后npm run mock - 别信“VSCode 自带热重载”——Node.js 没这功能,所有所谓“自动刷新”本质都是
nodemon或类似进程管理器在背后干活
接口数据用 Mock.js 生成,别手写 JSON
手写固定返回值很快会卡住:分页列表要造 20 条、用户头像要随机 URL、时间字段要格式化……这时候 Mock.js 的模板语法就省事得多。
注意它和 Express 的协作方式:
- 安装:
npm install mockjs - 在路由里直接调用,比如:
const Mock = require('mockjs'); app.get('/api/users', (req, res) => { const data = Mock.mock({ 'list|5-10': [{ 'id|+1': 1, 'name': '@cname()', 'avatar': '@image("100x100")' }] }); res.json(data); }); - 别把
Mock.mock()放在模块顶层——它会在服务启动时执行一次,之后永远返回同一份数据;必须包在路由回调里,每次请求都重新生成
真正麻烦的是嵌套结构和条件逻辑,比如根据 query 参数返回不同数量的数据,这时得用 Mock.setup({ timeout: '100-300' }) 加延迟模拟真实网络,否则测试时根本暴露不出竞态问题。











