Express 毕设实战 — 中间件与 RESTful 设计

知识库
知识库文档
/tech-stacks/express/tutorial/Express 毕设实战 — 中间件与 RESTful 设计.md

文档

Express 毕设实战 — 快速搭建后端 API

前言

Express 是 Node.js 最经典的 Web 框架,没有之一。它足够简单,但配合中间件生态能构建企业级应用。毕选用 Express 的最大优势是 :从零到能演示的 API 只需一个晚上。

第一章:中间件机制 — Express 的灵魂

Express 的核心就是 中间件管道。每个请求依次经过所有中间件:

// 中间件1: 日志
app.use((req, res, next) => {
  console.log(`${req.method} ${req.url}`);
  next(); // 不调 next() 请求就卡住了!
});

// 中间件2: 解析 JSON body
app.use(express.json());

// 中间件3: 认证(仅 /api 路由)
app.use('/api', (req, res, next) => {
  if (!req.headers.authorization) {
    return res.status(401).json({ error: '未登录' });
  }
  next();
});

// 最终处理
app.get('/api/data', (req, res) => {
  res.json({ message: '通过认证' });
});

执行顺序:请求 → 日志 → JSON解析 → 认证检查 → 路由处理 → 响应

第二章:错误处理

毕设答辩时如果程序崩溃就尴尬了。Express 的错误处理中间件是最后防线:

// 业务中抛出错误
app.get('/user/:id', async (req, res, next) => {
  try {
    const user = await db.findUser(req.params.id);
    if (!user) {
      const err = new Error('用户不存在');
      err.status = 404;
      throw err;
    }
    res.json(user);
  } catch (err) {
    next(err); // 交给错误处理中间件
  }
});

// 全局错误处理(必须有 4 个参数)
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(err.status || 500).json({
    error: err.message || '服务器内部错误',
  });
});

第三章:文件上传

毕设常见需求:头像上传、论文提交、图片管理。Multer 一行搞定:

const multer = require('multer');
const upload = multer({ dest: 'uploads/' });

app.post('/upload', upload.single('file'), (req, res) => {
  // req.file 包含文件信息
  res.json({
    filename: req.file.originalname,
    size: req.file.size,
    url: `/uploads/${req.file.filename}`,
  });
});

第四章:Express 生态必知中间件

中间件 用途 安装
morgan HTTP 请求日志 npm i morgan
cors 跨域资源共享 npm i cors
helmet 安全响应头 npm i helmet
express-rate-limit API 限流 npm i express-rate-limit
compression Gzip 压缩 npm i compression
const morgan = require('morgan');
const cors = require('cors');
const helmet = require('helmet');

app.use(helmet());
app.use(cors());
app.use(morgan('dev'));
app.use(express.json());

思考题

  1. 如果中间件 A 不调用 next(),中间件 B 会被执行吗?
  2. 如何优雅地处理未捕获的 Promise rejection?
  3. Express 和 Koa 的中间件模型有什么区别?(洋葱模型 vs 线性管道)

信息

路径
/tech-stacks/express/tutorial/Express 毕设实战 — 中间件与 RESTful 设计.md
更新时间
2026/5/30