阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 内置中间件与第三方中间件

内置中间件与第三方中间件

作者:陈川 阅读数:65134人阅读 分类: Node.js

Express框架中的中间件机制是其核心特性之一,允许开发者在请求和响应周期中插入自定义逻辑。中间件分为内置中间件和第三方中间件,它们在功能和使用方式上各有特点,适用于不同场景。

内置中间件

Express内置了多个常用的中间件,无需额外安装即可直接使用。这些中间件通常用于处理基础功能,例如解析请求体、托管静态文件等。

express.json()

express.json()用于解析JSON格式的请求体。当客户端发送Content-Type: application/json的请求时,该中间件会自动将请求体转换为JavaScript对象。

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

app.use(express.json());

app.post('/api/data', (req, res) => {
  console.log(req.body); // 直接访问解析后的JSON数据
  res.send('Data received');
});

app.listen(3000);

express.urlencoded()

express.urlencoded()用于解析URL编码的请求体(通常来自HTML表单提交)。它通过extended选项决定是否使用qs库解析复杂对象。

app.use(express.urlencoded({ extended: true }));

app.post('/form', (req, res) => {
  console.log(req.body); // { username: 'admin', password: '123' }
  res.send('Form processed');
});

express.static()

托管静态文件(如HTML、CSS、图片)是Web应用的常见需求。express.static()可指定静态资源的根目录:

// 托管public目录下的文件
app.use(express.static('public'));

// 访问示例:http://localhost:3000/images/logo.png

第三方中间件

第三方中间件通过npm安装,扩展了Express的核心功能。社区提供了大量解决特定问题的中间件。

body-parser

虽然Express 4.16+已内置类似功能,但body-parser仍广泛使用。它支持更多数据格式解析:

const bodyParser = require('body-parser');

// 解析text/plain格式
app.use(bodyParser.text());
app.post('/text', (req, res) => {
  console.log(req.body); // 原始文本字符串
});

morgan

morgan是HTTP请求日志记录器,支持多种日志格式:

const morgan = require('morgan');
app.use(morgan('dev')); 
// 输出示例:GET /api/users 200 12.356 ms

helmet

安全中间件helmet通过设置HTTP头保护应用:

const helmet = require('helmet');
app.use(helmet()); // 自动启用11项安全策略

cors

处理跨域请求时,cors中间件简化了CORS配置:

const cors = require('cors');
app.use(cors({
  origin: 'https://example.com' // 允许特定域
}));

自定义中间件组合

实际项目中常需组合使用多种中间件。例如构建API服务时:

const express = require('express');
const compression = require('compression');
const rateLimit = require('express-rate-limit');

const app = express();

// 基础中间件
app.use(express.json());
app.use(helmet());
app.use(compression()); // 响应压缩

// 限流中间件
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000,
  max: 100
});
app.use('/api/', limiter);

// 业务路由
app.get('/api/data', (req, res) => {
  res.json({ data: 'protected resource' });
});

中间件执行顺序

中间件的执行顺序至关重要。以下示例展示了错误处理的典型顺序:

// 日志记录最先执行
app.use(morgan('combined'));

// 业务路由
app.get('/user', (req, res) => {
  throw new Error('模拟错误');
});

// 404处理
app.use((req, res) => {
  res.status(404).send('Not found');
});

// 错误处理中间件(必须放在最后)
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('Server error');
});

性能优化实践

某些中间件可能影响性能,需谨慎使用:

  1. 开发环境专用:如morgan在生产环境应使用combined等轻量格式
  2. 按需加载:非全局中间件可仅在特定路由使用:
const debugMiddleware = require('debug-middleware');
app.get('/debug', debugMiddleware, (req, res) => { ... });
  1. 缓存静态文件
app.use(express.static('public', {
  maxAge: '1d' // 客户端缓存1天
}));

中间件开发规范

开发自定义中间件时需遵循约定:

  1. 必须调用next()或结束响应
  2. 错误处理中间件需四个参数
  3. 示例异步中间件:
const authMiddleware = async (req, res, next) => {
  try {
    req.user = await verifyToken(req.headers.authorization);
    next();
  } catch (err) {
    next(err); // 传递至错误处理器
  }
};

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌