Skip to content
On this page

Express框架

Express是Node.js最流行的Web应用框架,提供了一套简洁而强大的功能来开发Web应用和API。

Express简介

Express是一个快速、不显眼、功能丰富的Node.js Web应用框架。它提供了一系列强大的特性来开发Web和移动应用。

安装Express

bash
# 初始化项目
npm init -y

# 安装Express
npm install express

# 安装类型定义(可选)
npm install --save-dev @types/express

基础Hello World应用

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

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

app.listen(port, () => {
  console.log(`应用运行在 http://localhost:${port}`);
});

路由系统

基础路由

javascript
const express = require('express');
const app = express();

// GET请求
app.get('/', (req, res) => {
  res.send('GET请求到根路径');
});

// POST请求
app.post('/users', (req, res) => {
  res.send('POST请求到/users');
});

// PUT请求
app.put('/users/:id', (req, res) => {
  res.send(`PUT请求到/users/${req.params.id}`);
});

// DELETE请求
app.delete('/users/:id', (req, res) => {
  res.send(`DELETE请求到/users/${req.params.id}`);
});

// 响应多种HTTP方法
app.all('/secret', (req, res, next) => {
  console.log('访问了保密路径');
  next(); // 将控制权传递给下一个匹配的路由
});

路由参数

javascript
const express = require('express');
const app = express();

// 路由参数
app.get('/users/:userId/books/:bookId', (req, res) => {
  res.json({
    userId: req.params.userId,
    bookId: req.params.bookId
  });
});

// 可选参数
app.get('/users/:userId?', (req, res) => {
  if (req.params.userId) {
    res.json({ user: req.params.userId });
  } else {
    res.json({ message: '未指定用户' });
  }
});

// 查询参数
app.get('/search', (req, res) => {
  const { q, page = 1, limit = 10 } = req.query;
  res.json({
    query: q,
    page: parseInt(page),
    limit: parseInt(limit)
  });
});

// 正则表达式路由
app.get(/.*fly$/, (req, res) => {
  res.send('/.*fly$/ 匹配');
});

中间件

应用级中间件

javascript
const express = require('express');
const app = express();

// 使用内置中间件
app.use(express.json()); // 解析JSON请求体
app.use(express.urlencoded({ extended: true })); // 解析URL编码的请求体

// 自定义中间件
app.use((req, res, next) => {
  console.log(`${req.method} ${req.url} - ${new Date().toISOString()}`);
  next();
});

// 路径特定的中间件
app.use('/api', (req, res, next) => {
  console.log('API请求');
  next();
});

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

路由级中间件

javascript
const express = require('express');
const app = express();
const router = express.Router();

// 路由级中间件
router.use((req, res, next) => {
  console.log('路由中间件');
  next();
});

router.get('/', (req, res) => {
  res.send('路由主页');
});

app.use('/admin', router);

第三方中间件

javascript
const express = require('express');
const app = express();

// 安装: npm install cors helmet morgan
const cors = require('cors');
const helmet = require('helmet');
const logger = require('morgan');

// 安全中间件
app.use(helmet());

// CORS中间件
app.use(cors());

// 日志中间件
app.use(logger('dev'));

请求和响应对象

请求对象(req)

javascript
app.get('/user-info', (req, res) => {
  res.json({
    // 基本信息
    method: req.method,
    url: req.url,
    originalUrl: req.originalUrl,
    baseUrl: req.baseUrl,
    
    // 参数
    params: req.params,
    query: req.query,
    body: req.body, // 需要中间件解析
    
    // 头部信息
    headers: req.headers,
    ip: req.ip,
    hostname: req.hostname,
    
    // 协议和安全
    protocol: req.protocol,
    secure: req.secure,
    xhr: req.xhr, // 是否为AJAX请求
    
    // 路径信息
    path: req.path
  });
});

响应对象(res)

javascript
app.get('/response-examples', (req, res) => {
  // 发送不同类型的响应
  res.status(200).send('文本响应');
  
  // JSON响应
  res.json({ message: 'JSON响应' });
  
  // 渲染模板(需要配置模板引擎)
  // res.render('index', { title: '标题' });
  
  // 重定向
  // res.redirect('/new-location');
  
  // 下载文件
  // res.download('/path/to/file');
  
  // 发送文件
  // res.sendFile('/path/to/file');
  
  // 设置头部
  res.set('Content-Type', 'text/plain');
  res.set({
    'X-Custom-Header': 'value',
    'Cache-Control': 'no-cache'
  });
  
  // Cookie操作
  res.cookie('name', 'value', { maxAge: 900000, httpOnly: true });
  res.clearCookie('name');
  
  // 结束响应
  res.end();
});

静态文件服务

javascript
const express = require('express');
const app = express();

// 服务静态文件
app.use(express.static('public'));

// 使用自定义路径前缀
app.use('/static', express.static('public'));

// 设置最大缓存时间
app.use('/static', express.static('public', {
  maxAge: '1d', // 1天
  etag: false // 禁用ETag
}));

// 多个静态目录
app.use('/images', express.static('public/images'));
app.use('/css', express.static('public/css'));
app.use('/js', express.static('public/js'));

模板引擎

使用Pug模板引擎

bash
npm install pug
javascript
const express = require('express');
const app = express();

// 设置模板引擎
app.set('view engine', 'pug');
app.set('views', './views');

app.get('/', (req, res) => {
  res.render('index', { 
    title: 'Express模板示例',
    message: 'Hello Pug!'
  });
});

使用EJS模板引擎

bash
npm install ejs
javascript
const express = require('express');
const app = express();

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

app.get('/', (req, res) => {
  res.render('index', { 
    title: 'Express模板示例',
    message: 'Hello EJS!'
  });
});

RESTful API开发

用户管理API

javascript
const express = require('express');
const app = express();

app.use(express.json());

// 模拟数据库
let users = [
  { id: 1, name: '张三', email: 'zhang@example.com' },
  { id: 2, name: '李四', email: 'li@example.com' }
];

// 获取所有用户
app.get('/api/users', (req, res) => {
  const { page = 1, limit = 10 } = req.query;
  const startIndex = (page - 1) * limit;
  const endIndex = page * limit;
  
  res.json({
    users: users.slice(startIndex, endIndex),
    pagination: {
      page: parseInt(page),
      limit: parseInt(limit),
      total: users.length
    }
  });
});

// 获取特定用户
app.get('/api/users/:id', (req, res) => {
  const user = users.find(u => u.id === parseInt(req.params.id));
  if (!user) {
    return res.status(404).json({ error: '用户不存在' });
  }
  res.json(user);
});

// 创建用户
app.post('/api/users', (req, res) => {
  const { name, email } = req.body;
  
  if (!name || !email) {
    return res.status(400).json({ error: '姓名和邮箱是必需的' });
  }
  
  const newUser = {
    id: users.length > 0 ? Math.max(...users.map(u => u.id)) + 1 : 1,
    name,
    email
  };
  
  users.push(newUser);
  res.status(201).json(newUser);
});

// 更新用户
app.put('/api/users/:id', (req, res) => {
  const userId = parseInt(req.params.id);
  const userIndex = users.findIndex(u => u.id === userId);
  
  if (userIndex === -1) {
    return res.status(404).json({ error: '用户不存在' });
  }
  
  const { name, email } = req.body;
  users[userIndex] = { ...users[userIndex], name, email };
  res.json(users[userIndex]);
});

// 删除用户
app.delete('/api/users/:id', (req, res) => {
  const userId = parseInt(req.params.id);
  const userIndex = users.findIndex(u => u.id === userId);
  
  if (userIndex === -1) {
    return res.status(404).json({ error: '用户不存在' });
  }
  
  users.splice(userIndex, 1);
  res.status(204).send();
});

错误处理

全局错误处理

javascript
const express = require('express');
const app = express();

// 自定义错误类
class AppError extends Error {
  constructor(message, statusCode) {
    super(message);
    this.statusCode = statusCode;
    this.status = statusCode >= 400 && statusCode < 500 ? 'fail' : 'error';
    this.isOperational = true;
    
    Error.captureStackTrace(this, this.constructor);
  }
}

// 业务逻辑中间件
const getUserById = (req, res, next) => {
  const userId = parseInt(req.params.id);
  
  if (isNaN(userId)) {
    return next(new AppError('无效的用户ID', 400));
  }
  
  const user = users.find(u => u.id === userId);
  if (!user) {
    return next(new AppError('用户不存在', 404));
  }
  
  req.user = user;
  next();
};

// 使用错误处理中间件
app.get('/api/users/:id', getUserById, (req, res) => {
  res.json(req.user);
});

// 全局错误处理中间件
app.use((err, req, res, next) => {
  err.statusCode = err.statusCode || 500;
  err.status = err.status || 'error';
  
  if (process.env.NODE_ENV === 'development') {
    res.status(err.statusCode).json({
      status: err.status,
      error: err,
      message: err.message,
      stack: err.stack
    });
  } else {
    if (err.isOperational) {
      res.status(err.statusCode).json({
        status: err.status,
        message: err.message
      });
    } else {
      console.error('ERROR: ', err);
      res.status(500).json({
        status: 'error',
        message: '服务器内部错误'
      });
    }
  }
});

高级特性

中间件链和next()

javascript
// 中间件链示例
const validateUser = (req, res, next) => {
  if (!req.body.name) {
    return res.status(400).json({ error: '用户名是必需的' });
  }
  next();
};

const checkPermission = (req, res, next) => {
  // 模拟权限检查
  const hasPermission = true; // 实际应用中会检查用户权限
  if (!hasPermission) {
    return res.status(403).json({ error: '权限不足' });
  }
  next();
};

app.post('/api/users', validateUser, checkPermission, (req, res) => {
  res.json({ message: '用户创建成功' });
});

路由模块化

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

router.get('/', (req, res) => {
  res.json({ message: '获取所有用户' });
});

router.get('/:id', (req, res) => {
  res.json({ message: `获取用户 ${req.params.id}` });
});

router.post('/', (req, res) => {
  res.json({ message: '创建新用户' });
});

module.exports = router;

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

Express应用生成器

bash
# 安装Express生成器
npm install -g express-generator

# 创建应用骨架
express myapp --view=ejs

# 安装依赖
cd myapp
npm install

生产环境配置

环境变量配置

javascript
const express = require('express');
const app = express();

// 根据环境配置
const PORT = process.env.PORT || 3000;
const NODE_ENV = process.env.NODE_ENV || 'development';

if (NODE_ENV === 'production') {
  // 生产环境配置
  app.set('trust proxy', 1); // 信任第一层代理
  app.use(logger('combined')); // 详细的日志格式
} else {
  // 开发环境配置
  app.use(logger('dev'));
}

app.listen(PORT, () => {
  console.log(`服务器运行在端口 ${PORT}, 环境: ${NODE_ENV}`);
});

Express框架简化了Node.js Web应用的开发,提供了路由、中间件、模板引擎等强大功能,是构建现代Web应用的首选框架之一。