在 Node.js 中如何实现一个 timeout 的中间件?

介绍如何在 Node.js 中使用 Express 实现带超时功能的中间件,确保请求处理及时响应。

Node.js 中等 中间件 超时 超时处理

在 Node.js 中实现一个 timeout 中间件可以通过创建一个可配置的超时逻辑,用于控制 HTTP 请求的处理时长。常见基于 Express 或 Koa 框架实现,步骤如下:

  1. 设置超时中间件框架:使用模块导出函数接受配置参数(如 time),返回一个中间件函数,该函数封装超时逻辑。
  2. 创建定时器:在中间件中使用 setTimeout 设置计时器,超时时执行特定动作(如记录日志、返回 timeout 响应)。
  3. 清除定时器:重写 res.end 方法,确保响应结束时自动清除计时器,避免误判超时。例如:当响应处理完成时清除定时器调用 clearTimeout(timer)
  4. 自定义超时行为:在超时动作中添加逻辑,如发送错误响应或终止请求。

这里是一个基于 Express.js 的示例实现,代码包裹在 Markdown 中:

module.exports = function(opts) {
  const time = opts.time || 100; // 默认超时阈值
  return function(req, res, next) {
    const timer = setTimeout(() => {
      console.log(`${req.method} ${req.url} is taking too long`);
      // 超时时发送响应(如状态码 504)
      res.status(504).json({ error: 'Request timeout' });
      // 可能强制结束后续处理
    }, time);

    // 保存原始 res.end 并覆盖它来清除计时器
    const endOriginal = res.end;
    res.end = function(chunk, encoding) {
      clearTimeout(timer); // 确保取消定时器
      endOriginal.call(this, chunk, encoding); // 调用原始方法
    };

    next(); // 继续执行后续中间件或路由
  };
};

使用时在服务器中导入并配置:

const express = require('express');
const timeoutMiddleware = require('./timeout-middleware');
const app = express();
// 设置在路由层之上
app.use(timeoutMiddleware({ time: 3000 })); // 3秒超时
  • 注意点:确保超时值适当匹配业务需求,结合错误处理优化用户体验;在 Express 中避免阻塞 I/O,通过 async/await 兼容异步处理。