内置中间件与第三方中间件
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');
});
性能优化实践
某些中间件可能影响性能,需谨慎使用:
- 开发环境专用:如
morgan
在生产环境应使用combined
等轻量格式 - 按需加载:非全局中间件可仅在特定路由使用:
const debugMiddleware = require('debug-middleware');
app.get('/debug', debugMiddleware, (req, res) => { ... });
- 缓存静态文件:
app.use(express.static('public', {
maxAge: '1d' // 客户端缓存1天
}));
中间件开发规范
开发自定义中间件时需遵循约定:
- 必须调用
next()
或结束响应 - 错误处理中间件需四个参数
- 示例异步中间件:
const authMiddleware = async (req, res, next) => {
try {
req.user = await verifyToken(req.headers.authorization);
next();
} catch (err) {
next(err); // 传递至错误处理器
}
};
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn
上一篇:中间件的基本概念与工作原理
下一篇:自定义中间件的开发方法