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

仅调用next()的自定义Express中间件导致请求挂起问题

请求挂起?你误用了Express中间件工厂函数

兄弟,我一眼就揪出问题了——你写的是个带参数的中间件工厂函数,但在路由里直接把工厂函数本身传给了路由,没调用它生成真正能处理请求的中间件!

先看你的代码细节:
你的中间件导出的是一个工厂函数,它接收options参数后才会返回真正的中间件:

export default function (options) { 
  return function (req, res, next) { 
    next() 
  }; 
}

但你在路由里是这么用的:

import mymiddleware from '../middlewares/mymiddleware'; 
router.post('/', mymiddleware, function(req, res, next) { 
  res.status(200).send() 
});

这里的问题是:Express会把你传入的mymiddleware(也就是那个工厂函数)当作中间件执行,但此时工厂函数的参数会被Express当成req、res、next,而它返回的那个真正的中间件函数根本没机会运行!这就导致请求卡在了工厂函数这一步,没法走到后面的路由处理函数,自然就挂起了。

解决方法有两种,看你需求选:

  • 如果不需要配置参数:直接修改中间件,导出真正的中间件函数就行:
// 去掉外层的工厂函数,直接导出处理请求的中间件
export default function (req, res, next) { 
  next() 
};

这样你原来路由里的用法就完全没问题了。

  • 如果以后可能要加配置参数:在路由里调用工厂函数生成中间件(哪怕不传参数):
// 调用工厂函数,得到真正的中间件
router.post('/', mymiddleware(), function(req, res, next) { 
  res.status(200).send() 
});

这样Express拿到的就是能处理请求的中间件,调用next()后会正常走到后面的处理函数,请求就不会挂起了。

你可以加个日志验证一下:在工厂函数和返回的中间件里分别加console.log,如果用mymiddleware只会看到工厂函数的日志;用mymiddleware()则两个日志都会出现,请求也能正常返回200。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:15:47