在 Node.js 中如何实现一个 timeout 的中间件?
介绍如何在 Node.js 中使用 Express 实现带超时功能的中间件,确保请求处理及时响应。
在 Node.js 中实现一个 timeout 中间件可以通过创建一个可配置的超时逻辑,用于控制 HTTP 请求的处理时长。常见基于 Express 或 Koa 框架实现,步骤如下:
- 设置超时中间件框架:使用模块导出函数接受配置参数(如 time),返回一个中间件函数,该函数封装超时逻辑。
- 创建定时器:在中间件中使用
setTimeout
设置计时器,超时时执行特定动作(如记录日志、返回 timeout 响应)。 - 清除定时器:重写
res.end
方法,确保响应结束时自动清除计时器,避免误判超时。例如:当响应处理完成时清除定时器调用clearTimeout(timer)
。 - 自定义超时行为:在超时动作中添加逻辑,如发送错误响应或终止请求。
这里是一个基于 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
兼容异步处理。