在 Express.js 中,中间件函数是处理日志记录、身份验证和错误处理等重复性任务的利器。通过使用中间件,我们能够有效简化代码结构,并严格遵循“DRY”(Don‘t Repeat Yourself,不要重复你自己)这一重要的 设计模式 原则。中间件函数可以访问请求对象 (req)、响应对象 (res) 以及应用请求-响应周期中的下一个中间件函数。
好的代码示例
下面是一个使用了中间件的 Express.js 应用示例,它清晰地分离了关注点:
const express = require('express');
const app = express();
// 日志记录中间件
app.use((req, res, next) => {
console.log(`${req.method} ${req.url}`);
next(); // 将控制权传递给下一个中间件
});
// 身份验证中间件
app.use((req, res, next) => {
if (req.headers.authorization) {
next(); // 用户已认证,继续执行下一个中间件
} else {
res.status(401).send('Unauthorized');
}
});
// 路由处理
app.get('/', (req, res) => {
res.send('Hello, World!');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
糟糕的代码示例
作为对比,下面是一个没有使用中间件的实现。日志和认证逻辑与路由处理紧密耦合,导致代码重复且难以维护:
const express = require('express');
const app = express();
app.get('/', (req, res) => {
// 日志记录
console.log(`${req.method} ${req.url}`);
// 身份验证
if (req.headers.authorization) {
res.send('Hello, World!');
} else {
res.status(401).send('Unauthorized');
}
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
通过对比可以清晰地看到,在好的示例中,使用中间件函数处理日志记录和身份验证,使代码更具模块化和可重用性。而在糟糕的示例中,这些通用逻辑被直接写在路由处理函数内部,不仅造成了代码重复,也降低了整体的可读性和可维护性。
备忘录
Express.js 的中间件机制提供了极大的灵活性来组织代码结构。你可以在应用级别(对所有路由生效)、路由器级别(对一组路由生效)甚至为某个特定路由单独定义中间件。掌握并善用这一特性,是构建清晰、健壮后端服务的关键。更多关于服务架构和代码组织的讨论,欢迎在 云栈社区 交流分享。
|