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

如何在Node.js中编写HOC/中间件实现接口执行时长统计?

用Express中间件或HOC实现路由耗时统计,避免重复代码

方案一:Express中间件(推荐,贴合框架设计)

Express的中间件机制天生适合这种需要在请求前后注入逻辑的场景,只需要编写一次中间件,就能全局或针对特定路由生效:

// 定义耗时统计中间件
const logRequestDuration = (req, res, next) => {
  const begin = Date.now();
  // 监听响应完成事件,确保统计的是完整请求耗时
  res.on('finish', () => {
    const end = Date.now();
    const duration = (end - begin) / 1000;
    console.log(`请求 ${req.method} ${req.path} 耗时:${duration}s`);
  });
  next(); // 放行到后续路由处理逻辑
};

// 全局注册中间件,所有路由都会自动统计耗时
app.use(logRequestDuration);

// 你的路由和处理函数无需修改
router.get("/", users);

const users = (req, res) => {
  // 仅保留业务逻辑
  res.send("something");
};

这里利用res.finish事件,确保在响应完全发送给客户端后再计算耗时,得到的是整个请求从进入到处理完成的真实时长。

方案二:高阶函数(HOC)包装路由处理函数

如果需要针对个别路由单独配置,或者不想使用全局中间件,可以用HOC包装路由处理函数:

// 定义包装函数,接收原路由处理函数作为参数
const withDurationLog = (handler) => {
  return (req, res, next) => {
    const begin = Date.now();
    // 重写res.send方法,在响应发送后统计耗时
    const originalSend = res.send;
    res.send = function(data) {
      originalSend.call(this, data);
      const end = Date.now();
      const duration = (end - begin) / 1000;
      console.log(`请求 ${req.method} ${req.path} 耗时:${duration}s`);
    };
    // 执行原路由处理逻辑
    handler(req, res, next);
  };
};

// 使用HOC包装目标路由处理函数
router.get("/", withDurationLog(users));

const users = (req, res) => {
  // 业务逻辑保持不变
  res.send("something");
};

这种方式通过重写res.send方法,在原响应逻辑执行完毕后插入耗时统计,同样能准确获取请求处理的完整时长。

两种方案对比

  • 中间件方案:配置简单,全局生效,维护成本低,完全符合Express的设计思路,优先推荐。
  • HOC方案:灵活性更高,适合需要对特定路由做差异化处理的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:22:11