Node.js路由添加中间件失效问题求助
问题关键点解析
1. 工厂函数的调用逻辑
你的validateUniqueEmail是一个返回验证中间件的工厂函数,而非直接可用的Express中间件:
- 路由里只写
validateUniqueEmail时,相当于把这个工厂函数本身传给了Express。Express会尝试将它当作中间件执行,但这个函数的返回值才是真正的验证逻辑(由body().custom()生成的验证链)。 - 不加括号调用的话,Express执行完工厂函数后,不会自动处理它返回的验证中间件,请求卡在验证环节无法继续,最终导致阻塞。必须通过
validateUniqueEmail()主动执行工厂函数,拿到它返回的有效验证中间件传给路由。
2. 验证链的返回要求
工厂函数内部必须返回body().custom()生成的验证链:
body('email').custom(...)是express-validator提供的验证链对象,只有把它return出去,工厂函数执行后才会返回有效的验证中间件。- 如果省略return,工厂函数默认返回
undefined,即便路由里加了括号调用,传给Express的也是无效值,相当于没有配置验证逻辑,请求同样会阻塞。
修正后的代码示例
路由定义:
router.post("/add-user", validateUniqueEmail(), addUser);
中间件:
export const validateUniqueEmail = () => { // 必须返回验证链对象 return body('email').custom(email => { return UserModel.findOne({email}).then(user => { if (user) { return Promise.reject('E-mail already in use'); } }) }) }
内容的提问来源于stack exchange,提问作者Eusebius
相关产品推荐
相关产品推荐

