文档
Node.js 毕设实战教程
前言
Node.js 是大学毕设的热门选择,因为它一门语言打穿前后端。本教程将带你从零构建一个完整的毕设后端。
第一章:理解事件循环
Node.js 的核心是 事件循环(Event Loop)。与传统的多线程模型不同,Node.js 用单线程处理所有请求:
请求1 ──→ [Event Loop] ──→ 非阻塞I/O ──→ 回调1
请求2 ──→ ──→ 非阻塞I/O ──→ 回调2
请求3 ──→ ──→ CPU任务 ──→ 回调3
关键理解:CPU 密集任务会阻塞事件循环!一个大循环会让所有请求卡住。所以 Node.js 擅长 I/O 密集型(API 网关、实时聊天),不擅长视频编码、图像渲染。
// ❌ 阻塞事件循环
app.get('/slow', (req, res) => {
for (let i = 0; i < 1e10; i++) {} // 所有请求都卡住
res.send('done');
});
// ✅ 异步非阻塞
app.get('/fast', async (req, res) => {
const data = await fetchDataFromDB(); // 不阻塞
res.json(data);
});
第二章:项目结构最佳实践
毕设项目推荐的分层结构:
my-project/
├── src/
│ ├── controllers/ # 处理 HTTP 请求
│ ├── services/ # 业务逻辑
│ ├── models/ # 数据模型(Mongoose/Prisma)
│ ├── middlewares/ # 认证、日志、错误处理
│ ├── routes/ # 路由定义
│ ├── utils/ # 工具函数
│ └── app.js # Express 实例
├── tests/
├── .env # 环境变量
└── package.json
为什么这么分?
- Controller 只负责取参数、调 Service、返回响应
- Service 包含所有业务逻辑,可复用、可测试
- Model 定义数据结构,与数据库交互
第三章:认证系统(JWT)
毕设中几乎每个项目都需要登录。JWT 是最简单的方案:
const jwt = require('jsonwebtoken');
// 登录 — 签发 Token
app.post('/login', (req, res) => {
const { username, password } = req.body;
// 验证账号密码(略)
const token = jwt.sign(
{ userId: user.id, role: user.role },
process.env.JWT_SECRET,
{ expiresIn: '7d' }
);
res.json({ token });
});
// 中间件 — 验证 Token
const authMiddleware = (req, res, next) => {
const token = req.headers.authorization?.split(' ')[1];
if (!token) return res.status(401).json({ error: '请先登录' });
try {
req.user = jwt.verify(token, process.env.JWT_SECRET);
next();
} catch {
res.status(401).json({ error: 'Token 已过期' });
}
};
// 保护路由
app.get('/profile', authMiddleware, (req, res) => {
res.json({ userId: req.user.userId });
});
第四章:数据库选择指南
| 数据库 | 适用场景 | Node.js ORM |
|---|---|---|
| MongoDB | 灵活文档、快速原型 | Mongoose |
| PostgreSQL | 关系型、复杂查询 | Prisma / TypeORM |
| SQLite | 毕设演示、单文件 | better-sqlite3 |
| MySQL | 传统 Web 应用 | Prisma / Sequelize |
推荐:毕设用 SQLite + Prisma,零配置,答辩时直接复制 .db 文件即可演示。
第五章:部署上线
# 使用 PM2 进程管理
npm install -g pm2
pm2 start src/app.js --name my-api
pm2 save
pm2 startup # 开机自启
思考题
- 如果有个请求需要处理 10 秒,如何避免阻塞其他请求?
- JWT Token 存在前端哪里最安全?(提示:Cookie vs localStorage)
- 10 万用户同时在线,Node.js 单进程够用吗?(提示:PM2 cluster mode)