🎯 学习目标
通过本文,你将深入理解Node.js错误处理的核心原理和实践应用,掌握以下关键技能:
- 错误捕获的基本概念和工作机制
- 错误边界的进阶技巧和最佳实践
- 日志记录的实际应用和性能优化 预计学习时间:12小时
💡 核心概念详解
Node.js错误处理是后端开发中的重要知识,掌握这些技能可以构建高性能的服务端应用。
基础用法
// Node.js错误处理基础示例
import express from 'express';
const app = express();
app.use(express.json());
app.get('/api/users', async (req, res) => {
const users = await User.find();
res.json(users);
});
app.post('/api/users', async (req, res) => {
const user = new User(req.body);
await user.save();
res.status(201).json(user);
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
进阶用法
// Node.js错误处理进阶示例
import express from 'express';
import rateLimit from 'express-rate-limit';
import helmet from 'helmet';
const app = express();
app.use(helmet());
app.use(express.json({ limit: '10mb' }));
const apiLimiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 100,
message: 'Too many requests, please try again later.'
});
app.use('/api/', apiLimiter);
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
next();
});
app.use((error, req, res, next) => {
console.error(error.stack);
res.status(500).json({ error: 'Internal Server Error' });
});
app.listen(3000);
实战场景
// Node.js错误处理实战示例 - RESTful API
import express from 'express';
import mongoose from 'mongoose';
const app = express();
app.use(express.json());
mongoose.connect('mongodb://localhost:27017/mydb');
const userSchema = new mongoose.Schema({
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
createdAt: { type: Date, default: Date.now }
});
const User = mongoose.model('User', userSchema);
app.get('/api/users', async (req, res) => {
const page = parseInt(req.query.page) || 1;
const limit = parseInt(req.query.limit) || 10;
const skip = (page - 1) * limit;
const users = await User.find()
.skip(skip)
.limit(limit)
.sort({ createdAt: -1 });
const total = await User.countDocuments();
res.json({
users,
pagination: {
current: page,
totalPages: Math.ceil(total / limit),
total
}
});
});
app.get('/api/users/:id', async (req, res) => {
try {
const user = await User.findById(req.params.id);
if (!user) {
return res.status(404).json({ error: 'User not found' });
}
res.json(user);
} catch (error) {
res.status(400).json({ error: 'Invalid ID' });
}
});
app.listen(3000);
📖 深入理解错误捕获
错误捕获是后端开发的核心基础。
核心原理
理解HTTP协议、RESTful设计原则和API设计模式。
关键特性
- HTTP方法: GET、POST、PUT、DELETE等
- 状态码: 2xx成功、4xx客户端错误、5xx服务器错误
- 请求处理: 路由匹配、中间件处理
- 响应格式: JSON格式响应
常见误区
- 忽略错误处理: 缺少错误处理会导致应用崩溃
- 未验证输入: 未验证用户输入会导致安全漏洞
- 缺少日志: 缺少日志难以排查问题
📖 掌握错误边界
错误边界是数据库操作的重要内容。
SQL优化技巧
- 索引优化: 创建适当的索引
- 查询优化: 优化复杂查询
- 连接优化: 使用连接池复用连接
NoSQL使用
- MongoDB: 文档型数据库
- Redis: 缓存和会话存储
- 选择合适的数据库: 根据需求选择
📖 实践日志记录
日志记录涵盖了安全和性能的最佳实践。
安全实践
- 输入验证: 验证所有用户输入
- 认证授权: JWT认证、OAuth2
- 安全头: 设置适当的安全响应头
性能优化
- 缓存策略: 使用Redis缓存
- 负载均衡: 使用Nginx或负载均衡器
- 异步处理: 将耗时操作异步化
⚖️ 方案对比
| 数据库 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| MySQL | 成熟稳定 | 扩展性有限 | 中小型应用 |
| PostgreSQL | 功能强大 | 学习成本高 | 复杂查询 |
| MongoDB | 灵活schema | 查询能力有限 | 非结构化数据 |
📚 推荐学习资源
- Express文档 — Express指南
- PostgreSQL Docs — 数据库文档
- Redis文档 — 缓存文档
🚀 实践建议
后端服务部署推荐使用DigitalOcean,新用户可获得200美元额度!