仅调用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
相关产品推荐
相关产品推荐

