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

