一、为什么选择Node.js与Express?
1.1 Node.js核心优势
- 事件驱动架构:单线程处理高并发(对比传统多线程模型)
- 非阻塞I/O:适合I/O密集型场景(数据库操作、文件读写等)
- NPM生态:超过130万个开源包,生态丰富
- 全栈能力:统一JavaScript语言栈(前端+后端)
1.2 Express框架特性
- 中间件管道:洋葱模型处理请求(图示说明)
- 路由系统:支持正则表达式和参数匹配
- 模板引擎:支持20+视图模板(Pug/EJS等)
- 扩展性:通过中间件实现功能扩展
1.3 适用场景分析
- 实时应用(聊天室、协作工具)
- API网关(微服务架构)
- 服务端渲染(SSR)
- 快速原型开发
二、环境搭建与工程化配置
2.1 开发环境准备
nvm install 18.16.0nvm use 18.16.0pnpm initpnpm add express@4.18.2 mongoose@7.6.0 bcryptjs@2.4.3 pnpm add -D typescript@5.2.2 @types/express @types/node nodemon
2.2 目录结构演进
高级项目结构设计:├── src/│ ├── config/ # 配置项│ │ ├── db.ts # 数据库配置│ │ └── jwt.ts # JWT密钥管理│ ├── controllers/ # 业务控制器│ ├── interfaces/ # TypeScript接口定义│ ├── middleware/ # 自定义中间件│ ├── models/ # 数据模型│ ├── routes/ # 路由配置│ ├── services/ # 业务逻辑层│ ├── utils/ # 工具函数│ └── app.ts # Express实例├── test/ # 测试用例├── .env.example # 环境变量模板└── package.json
2.3 TypeScript集成
{ \"compilerOptions\": { \"target\": \"ES2022\", \"module\": \"NodeNext\", \"outDir\": \"./dist\", \"strict\": true, \"esModuleInterop\": true, \"skipLibCheck\": true, \"moduleResolution\": \"node\" }}
三、Express中间件机制深度剖析
3.1 中间件类型详解
类型 |
示例 |
执行时机 |
应用级中间件 |
app.use(express.json()) |
每次请求 |
路由级中间件 |
router.use(auth) |
匹配到路由时 |
错误处理中间件 |
(err, req, res, next) |
抛出错误时 |
内置中间件 |
express.static |
静态资源请求 |
第三方中间件 |
cors |
根据配置决定 |
3.2 中间件开发实战
const requestLogger = (req, res, next) => { const start = Date.now(); res.on(\'finish\', () => { const duration = Date.now() - start; console.log( `${ req.method} ${ req.originalUrl} - ${ res.statusCode} [${ duration}ms]` ); }); next();};app.use(requestLogger);
3.3 中间件执行顺序实验
app.use((req, res, next) => { console.log(\'Middleware 1 - Start\'); next(); console.log(\'Middleware 1 - End\');});app.use((req, res, next) => { console.log(\'Middleware 2 - Start\'); next(); console.log(\'Middleware 2 - End\');});
四、路由系统设计与RESTful规范
4.1 RESTful API设计原则
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 版本控制实现方案
app.use(\'/api/v1/users\', v1UserRouter);app.use(\'/api/v2/users\', v2UserRouter);const apiVersion = (version) => (req, res, next) => { req.apiVersion = version; next();};app.use(\'/api/users\', ap