找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2697

积分

0

好友

353

主题
发表于 4 天前 | 查看: 16| 回复: 0

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 的中间件机制提供了极大的灵活性来组织代码结构。你可以在应用级别(对所有路由生效)、路由器级别(对一组路由生效)甚至为某个特定路由单独定义中间件。掌握并善用这一特性,是构建清晰、健壮后端服务的关键。更多关于服务架构和代码组织的讨论,欢迎在 云栈社区 交流分享。




上一篇:C++引用是否占用内存空间?详解其底层实现与指针对比
下一篇:RISC-V指令集生态:对比Intel x86与ARM授权模式
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-24 01:43 , Processed in 0.362218 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表