You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js Express中全局调用请求前后的指定函数?

如何在Express中全局执行请求处理函数

嘿,这个需求太常见了!完全不用在每个接口里重复写函数调用——Express的中间件机制就是为这种全局场景设计的,能让你指定的函数自动在所有(或特定范围)请求的处理流程中执行,省心又高效。

核心方案:全局中间件

Express的app.use()方法可以注册全局中间件,所有进入服务器的请求都会先经过这个中间件函数,再到达对应的路由处理逻辑。

代码示例

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

// 定义你要全局执行的函数
const globalHandler = (req, res, next) => {
  // 这里写你需要的逻辑,比如记录请求日志、验证通用权限等
  console.log(`[${new Date().toISOString()}] 收到请求:${req.method} ${req.url}`);
  
  // 务必调用next(),让请求继续流向后续的路由处理
  next();
};

// 注册全局中间件——要放在所有路由定义之前!
app.use(globalHandler);

// 你的现有路由,无需修改任何代码
app.get('/admin/logs', (req, res) => {
  res.status(200).json({ logs: ['log1', 'log2'] });
});

// 其他接口也会自动触发globalHandler
app.post('/api/users', (req, res) => {
  res.status(201).json({ message: '用户创建成功' });
});

app.listen(3000, () => {
  console.log('服务器运行在 http://localhost:3000');
});

进阶:针对特定路由前缀生效

如果不需要对所有接口生效,只想让/admin开头的接口触发这个函数,可以给app.use()指定路径前缀:

// 只有/admin开头的请求会经过这个中间件
app.use('/admin', globalHandler);

响应发送后执行逻辑

如果你的函数需要在响应发送给客户端之后执行(比如统计请求耗时),可以监听res对象的finish事件:

const globalHandler = (req, res, next) => {
  const startTime = Date.now();
  next(); // 先让请求处理完成
  
  // 响应发送后执行的逻辑
  res.on('finish', () => {
    const elapsedTime = Date.now() - startTime;
    console.log(`请求${req.url}耗时:${elapsedTime}ms`);
  });
};

注意事项

  • 中间件顺序很关键:一定要把全局中间件注册在所有路由定义之前,否则路由会先执行,中间件就不会被触发。
  • 必须调用next():除非你在中间件里直接返回响应(比如权限验证失败时返回403),否则一定要调用next()让请求继续流转,否则客户端会一直处于等待状态。

内容的提问来源于stack exchange,提问作者sleatrou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:40:56