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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:32:10