Express调用validateReview中间件报错TypeError: next() is not a function
错误原因
你编写的两个校验中间件本身逻辑不存在问题,next is not a function报错的本质是validateReview被调用时,没有接收到Express自动注入的next参数,问题出在你注册使用validateReview的路由代码中:
- 最常见的原因是你在路由中使用
validateReview时额外加了括号,相当于直接主动执行了函数,而非把函数作为中间件传入,这种情况下不会自动注入req/res/next三个参数,导致next为undefined。 - 另一种可能是
validateReview在路由参数中的顺序错误,比如放在了业务请求处理函数之后,Express不会给错误处理中间件之外的后置函数传入next参数。
解决方法
- 检查所有用到
validateReview的路由配置,确保你是直接传入函数引用,没有主动调用:
// 错误写法,加括号主动调用了函数 app.post('/campgrounds/:id/reviews', validateReview(), (req, res) => { // 业务逻辑 }) // 正确写法,直接传入函数引用,由Express自动执行并注入参数 app.post('/campgrounds/:id/reviews', validateReview, (req, res, next) => { // 业务逻辑 })
- 确认
validateReview的位置在路由的业务处理函数之前,符合Express中间件的执行顺序要求。 - 若排查后仍未解决,可在
validateReview函数首行打印参数确认传入情况:
const validateReview = (req, res, next) => { console.log('next类型:', typeof next) // 原有校验逻辑 }
如果打印结果为function说明参数传入正常,可进一步校验schema逻辑是否异常,如果为undefined则可以确定是路由注册环节的问题。
内容的提问来源于stack exchange,提问作者Samip
相关产品推荐
相关产品推荐

