Express 中间件:Node.js 开发的得力助手

一、中间件是什么?

Express中间件是请求处理流水线 的关键组件,本质就是一个函数,具备以下特征:

• 链式执行 :通过next()控制流程传递

• 功能模块化 :每个中间件专注单一职责(如日志、验证、压缩)

• 访问完整上下文:可修改请求(req)、响应(res)对象

javascript 复制代码
// 基础中间件示例
app.use((req, res, next) => {
  console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
  next(); // 必须调用next()传递控制权
});

二、中间件的五大类型

  1. 应用级中间件

    javascript 复制代码
    // 全局中间件(所有路由生效)
    app.use(express.json()); 
    
    // 路径过滤中间件
    app.use('/admin', authMiddleware);
  2. 路由级中间件

    javascript 复制代码
    const router = express.Router();
    router.use(logger);
  3. 错误处理中间件

    javascript 复制代码
    app.use((err, req, res, next) => {
      console.error(err.stack);
      res.status(500).send('服务异常!');
    });
  4. 第三方中间件

    bash 复制代码
    # 常用中间件安装
    npm install morgan helmet cors
    javascript 复制代码
    app.use(helmet()); // 安全防护
    app.use(morgan('dev')); // 请求日志
  5. 内置中间件

    javascript 复制代码
    app.use(express.static('public')); // 静态资源
    app.use(express.urlencoded({ extended: true })); // 表单解析

三、中间件的执行顺序

Express 中间件按照它们被定义的顺序依次执行。当一个中间件调用 next() 函数时,控制权会传递给下一个中间件或路由处理函数。如果中间件没有调用 next() 函数,请求处理流程将被终止。

javascript 复制代码
app.use((req, res, next) => {
    console.log('第一个中间件');
    next();
});

app.use((req, res, next) => {
    console.log('第二个中间件');
    next();
});

app.get('/', (req, res) => {
    res.send('请求处理完成');
});

在上述代码中,当有请求到达时,会依次执行第一个中间件、第二个中间件,最后执行路由处理函数。

四、中间件的实战应用

  1. 日志记录中间件

    记录请求时间、IP、方法等关键信息

    javascript 复制代码
    const fs = require('fs');
    app.use((req, res, next) => {
        const log = `${new Date().toISOString()} - ${req.ip} ${req.method} ${req.url}\n`;
        fs.appendFile('access.log', log, (err) => { if (err) throw err; });
        next();
    });
  2. 身份验证中间件

    拦截未授权请求,保护敏感路由

    javascript 复制代码
    app.use('/admin', (req, res, next) => {
        if (!req.headers.auth) {
            res.status(401).send('未授权!');
        } else {
            next();
        }
    });
  3. 路由参数处理

    动态捕获URL参数,实现灵活路由

    javascript 复制代码
    app.get('/user/:id', (req, res) => {
        res.send(`用户ID: ${req.params.id}`);
    });
相关推荐
Csvn16 分钟前
性能监控
前端
Highcharts.js18 分钟前
Highcharts Gantt使用符号的自定义数据标签开发甘特图示例
javascript·甘特图·highcharts·图表开发·实战代码·响应式图表
Csvn43 分钟前
构建工具
前端
FRing031 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
kyriewen3 小时前
Skills 榜前 10 我全装了:只有 3 个能直接用
前端·javascript·程序员
IT_陈寒4 小时前
当Java的hashCode遇上Lombok,我的缓存被全清了
前端·人工智能·后端
工控丫丫4 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
jerrywus4 小时前
我用 GPT-6.1-sol 做了台会讲解的 3D 售货机:60 罐饮料,一口没喝上
前端·agent·claude
孟陬6 小时前
Foobar 技术周刊#159:当看不懂代码时,如何高效排障调试。脏页陷阱:一条只读查询,写入数 TB 数据。推测解码:大模型加速利器
前端·人工智能·后端
Zhao-Jichao6 小时前
AI Prompting for Everyone 课程笔记 - P17 图像生成 Imaging Generation
前端