Express.js 框架教程:从入门到精通

一、Express.js 简介

Express.js 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供了一系列强大的特性来帮助创建各种 Web 和移动设备应用。

1.1 Express 的特点

  • 轻量级且灵活
  • 中间件架构
  • 路由系统强大
  • 支持多种模板引擎
  • 易于集成数据库

1.2 为什么选择 Express

  • Node.js 最流行的 web 框架
  • 学习曲线平缓
  • 庞大的社区支持
  • 适合构建 RESTful API

二、环境搭建与基本应用

2.1 安装 Express

# 创建项目目录并初始化
mkdir my-express-app
cd my-express-app
npm init -y

# 安装 Express
npm install express

2.2 创建第一个 Express 应用

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
});

2.3 运行应用

node app.js

三、核心概念

3.1 路由处理

Express 提供了简单直观的路由定义方式:

// 基本路由
app.get('/', (req, res) => {
  res.send('GET request to homepage');
});

app.post('/', (req, res) => {
  res.send('POST request to homepage');
});

// 路径参数
app.get('/users/:userId', (req, res) => {
  res.send(`User ID: ${req.params.userId}`);
});

// 路由链
app.route('/book')
  .get((req, res) => {
    res.send('Get a random book');
  })
  .post((req, res) => {
    res.send('Add a book');
  });

3.2 中间件

中间件是 Express 的核心概念,可以访问请求对象(req)、响应对象(res)和应用程序的请求-响应循环中的下一个中间件函数。

// 应用级中间件
app.use((req, res, next) => {
  console.log('Time:', Date.now());
  next();
});

// 路由级中间件
app.use('/user/:id', (req, res, next) => {
  console.log('Request Type:', req.method);
  next();
});

// 错误处理中间件
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

3.3 静态文件服务

app.use(express.static('public'));

四、高级特性

4.1 模板引擎集成

Express 支持多种模板引擎,如 Pug、EJS、Handlebars 等。

// 设置 EJS 为模板引擎
app.set('view engine', 'ejs');

// 渲染视图
app.get('/', (req, res) => {
  res.render('index', { title: 'Express App', message: 'Hello there!' });
});

4.2 RESTful API 开发

// 获取资源列表
app.get('/api/users', (req, res) => {
  res.json([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]);
});

// 获取单个资源
app.get('/api/users/:id', (req, res) => {
  res.json({ id: req.params.id, name: 'John Doe' });
});

// 创建资源
app.post('/api/users', express.json(), (req, res) => {
  // req.body 包含请求体
  res.status(201).json({ id: 3, ...req.body });
});

// 更新资源
app.put('/api/users/:id', express.json(), (req, res) => {
  res.json({ id: req.params.id, ...req.body });
});

// 删除资源
app.delete('/api/users/:id', (req, res) => {
  res.status(204).end();
});

4.3 错误处理

// 同步错误处理
app.get('/error', (req, res) => {
  throw new Error('BROKEN'); // Express 将捕获此错误
});

// 异步错误处理
app.get('/async-error', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err); // 将错误传递给 Express
    } else {
      res.send(data);
    }
  });
});

五、项目结构与最佳实践

5.1 推荐的项目结构

my-express-app/
├── node_modules/
├── config/
│   └── config.js
├── controllers/
│   └── userController.js
├── models/
│   └── userModel.js
├── routes/
│   └── userRoutes.js
├── public/
│   ├── css/
│   ├── js/
│   └── images/
├── views/
│   └── index.ejs
├── app.js
└── package.json

5.2 路由分离示例

// routes/userRoutes.js
const express = require('express');
const router = express.Router();

router.get('/', (req, res) => {
  res.send('User list');
});

router.get('/:id', (req, res) => {
  res.send(`User ID: ${req.params.id}`);
});

module.exports = router;

// app.js
const userRoutes = require('./routes/userRoutes');
app.use('/users', userRoutes);

5.3 环境变量管理

使用 dotenv 管理环境变量:

npm install dotenv

创建 .env 文件:

PORT=3000
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3

在应用中加载:

require('dotenv').config();

const port = process.env.PORT || 3000;
// ...

六、部署与性能优化

6.1 生产环境部署

  • 使用 NODE_ENV=production 环境变量
  • 使用进程管理器(如 PM2)
  • 启用 Gzip 压缩
  • 设置正确的安全头

6.2 性能优化技巧

// 启用压缩
const compression = require('compression');
app.use(compression());

// 启用缓存
const apicache = require('apicache');
const cache = apicache.middleware;
app.get('/api/expensive-route', cache('5 minutes'), (req, res) => {
  // 昂贵的操作
});

// 集群模式
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  // 启动 Express 应用
}

七、常见扩展与插件

7.1 常用中间件

  • body-parser: 解析请求体
  • cookie-parser: 解析 cookie
  • morgan: HTTP 请求日志记录
  • helmet: 安全相关 HTTP 头设置
  • cors: 跨域资源共享支持

7.2 数据库集成

// MongoDB (Mongoose)
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/myapp');

// MySQL
const mysql = require('mysql2');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  database: 'test'
});

八、实战项目:构建一个博客系统

8.1 项目需求

  • 用户认证
  • 文章发布
  • 评论功能
  • 分类管理

8.2 核心代码示例

// 用户认证路由
const passport = require('passport');

app.post('/login', 
  passport.authenticate('local', { 
    successRedirect: '/',
    failureRedirect: '/login',
    failureFlash: true 
  })
);

// 文章路由
app.get('/posts', postController.getAllPosts);
app.post('/posts', authMiddleware, postController.createPost);
app.get('/posts/:id', postController.getPost);
app.put('/posts/:id', authMiddleware, postController.updatePost);
app.delete('/posts/:id', authMiddleware, postController.deletePost);

九、学习资源与进阶方向

9.1 推荐学习资源

9.2 进阶方向

  • 深入中间件开发
  • 微服务架构
  • GraphQL API 开发
  • Serverless 部署
  • 性能监控与调优
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值