# Node.js快速入门:打造基于Express的RESTfulAPI
## 一、Node.js与Express框架技术选型
### 1.1 为什么选择Node.js构建API
Node.js凭借其非阻塞I/O模型和事件驱动架构,在处理高并发API请求时展现出显著优势。根据2023年Stack Overflow开发者调查报告,Node.js在Web框架使用率排名中位居前三,其单线程事件循环机制可轻松支持每秒数千个并发连接。
### 1.2 Express框架的核心优势
Express.js作为最流行的Node.js Web框架,提供以下核心功能:
- 中间件(Middleware)架构模式
- 路由(Routing)分层管理
- 模板引擎集成支持
- HTTP工具库增强
// Express安装量统计(截至2023年12月)
npm stats express
// 周下载量:2800万+
// 依赖项目:600万+
## 二、环境搭建与项目初始化
### 2.1 开发环境配置
建议使用Node.js LTS版本(18.x)并配置npm源:
# 安装nvm管理Node版本
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
# 安装LTS版本
nvm install --lts
### 2.2 项目脚手架搭建
通过npm初始化项目并安装关键依赖:
mkdir express-api && cd express-api
npm init -y
npm install express dotenv mongoose joi
推荐项目结构:
```
├── config/ # 环境配置
├── controllers/ # 业务逻辑
├── models/ # 数据模型
├── routes/ # 路由定义
├── middlewares/ # 自定义中间件
└── app.js # 入口文件
```
## 三、构建基础Express服务器
### 3.1 创建HTTP服务器实例
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
// 基础健康检查端点
app.get('/health', (req, res) => {
res.json({ status: 'UP', timestamp: Date.now() });
});
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
### 3.2 配置生产环境优化
在app.js中添加性能优化配置:
// 启用请求体解析
app.use(express.json({ limit: '10kb' }));
app.use(express.urlencoded({ extended: true }));
// 安全头部设置
app.use(helmet());
// 开发环境日志
if (process.env.NODE_ENV === 'development') {
app.use(morgan('dev'));
}
## 四、设计RESTful API路由
### 4.1 RESTful规范实践
遵循Richardson成熟度模型Level 3规范设计用户资源接口:
| HTTP方法 | 路径 | 功能描述 |
|----------|--------------|-------------------|
| GET | /api/users | 获取用户列表 |
| POST | /api/users | 创建新用户 |
| GET | /api/users/:id | 获取单个用户详情 |
| PUT | /api/users/:id | 全量更新用户信息 |
| PATCH | /api/users/:id | 部分更新用户信息 |
| DELETE | /api/users/:id | 删除指定用户 |
### 4.2 路由模块化实现
创建routes/users.js:
const express = require('express');
const router = express.Router();
const userController = require('../controllers/userController');
router.route('/')
.get(userController.getAllUsers)
.post(userController.createUser);
router.route('/:id')
.get(userController.getUser)
.put(userController.updateUser)
.delete(userController.deleteUser);
module.exports = router;
## 五、使用中间件增强API功能
### 5.1 常用中间件配置
// 跨域处理
app.use(cors({
origin: process.env.CLIENT_URL,
methods: ['GET','POST','PUT','DELETE']
}));
// 速率限制(每个IP每分钟100次请求)
app.use(rateLimit({
windowMs: 60 * 1000,
max: 100,
message: '请求过于频繁,请稍后再试'
}));
### 5.2 自定义日志中间件
const requestLogger = (req, res, next) => {
const start = Date.now();
res.on('finish', () => {
const duration = Date.now() - start;
console.log(`${req.method} ${req.path} - ${res.statusCode} [${duration}ms]`);
});
next();
};
## 六、数据验证与错误处理
### 6.1 使用Joi进行请求验证
const userSchema = Joi.object({
name: Joi.string().min(3).required(),
email: Joi.string().email().required(),
password: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{8,30}$'))
});
const validateUser = (req, res, next) => {
const { error } = userSchema.validate(req.body);
if (error) return res.status(400).json({
code: 'VALIDATION_ERROR',
details: error.details.map(d => d.message)
});
next();
};
### 6.2 统一错误处理中间件
app.use((err, req, res, next) => {
console.error(err.stack);
const statusCode = err.statusCode || 500;
const message = statusCode === 500 ? '服务器内部错误' : err.message;
res.status(statusCode).json({
code: err.code || 'INTERNAL_ERROR',
message,
...(process.env.NODE_ENV === 'development' && { stack: err.stack })
});
});
## 七、数据库集成与性能优化
### 7.1 MongoDB连接配置
const mongoose = require('mongoose');
const connectDB = async () => {
try {
await mongoose.connect(process.env.MONGO_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
serverSelectionTimeoutMS: 5000
});
console.log('MongoDB connected');
} catch (err) {
console.error('Database connection failed:', err);
process.exit(1);
}
};
module.exports = connectDB;
### 7.2 查询性能优化策略
1. 索引优化:为高频查询字段创建组合索引
2. 分页实现:使用skip+limit或游标分页
3. 投影优化:仅返回必要字段
4. 聚合管道:复杂查询使用aggregate
## 八、API测试与部署实践
### 8.1 使用Jest进行单元测试
test('GET /api/users 应返回用户列表', async () => {
const res = await request(app)
.get('/api/users')
.expect('Content-Type', /json/)
.expect(200);
expect(res.body).toBeInstanceOf(Array);
});
### 8.2 PM2生产环境部署
# 启动集群模式(4个worker进程)
pm2 start app.js -i 4 --name "api-server"
# 配置日志轮转
pm2 install pm2-logrotate
---
**技术标签**:
#Node.js #Express框架 #RESTfulAPI设计 #后端开发 #MongoDB集成 #API安全