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

Express中间件突发失效引发Mongo重复键错误,疑与框架更新相关

问题诊断与修复方案

核心问题1:路由语法错误导致中间件完全未加载

你的/signup路由定义里,路径和中间件数组之间漏了一个逗号,这会让Express无法识别中间件数组,直接跳过所有前置校验逻辑,请求直接走到authCtrl.signUp控制器,触发MongoDB的唯一索引约束错误。

错误代码:

router.post('/signup'[verifySignup.checkDuplicateMail,verifySignup.checkDocument,verifySignup.checkPhone,verifySignup.checkRolesExist] ,authCtrl.signUp)

修复后:

router.post('/signup', [verifySignup.checkDuplicateMail,verifySignup.checkDocument,verifySignup.checkPhone,verifySignup.checkRolesExist], authCtrl.signUp)

核心问题2:中间件字段匹配错误

报错显示MongoDB的重复键索引是mail_1,说明你的users集合在mail字段上有唯一约束,但你的checkDuplicateMail中间件里,查询的是email字段:

const mail = await Users.findOne({email:req.body.mail})

这会导致中间件查不到已存在的重复邮箱,根本起不到拦截作用。需要把查询条件改成和索引一致的mail字段:

const existingUser = await Users.findOne({mail: req.body.mail})

额外优化:异步中间件添加错误捕获

所有异步中间件都要加try/catch,否则一旦数据库查询出错,会导致请求挂起或者服务器崩溃,把错误传给Express的错误处理中间件:

export const checkDuplicateMail = async(req,res,next)=>{
  try {
    const existingUser = await Users.findOne({mail: req.body.mail})
    if(existingUser) return res.status(400).json("Este correo ya está registrado")
    next();
  } catch(err) {
    next(err);
  }
}

其他几个异步中间件(checkDocument、checkPhone)也需要做同样的错误捕获处理。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:15:31