Node.js+Mongoose使用express-validator校验邮箱重复报错如何解决?
错误1:User.findUserByEmail is not a function 解决方法
该方法是官方示例中自定义的Mongoose静态方法,你没有在User模型中定义所以调用失败。如果要使用该写法,需要在User模型代码中补充静态方法声明:
// User 模型文件中添加 userSchema.statics.findUserByEmail = function(email) { return this.findOne({ email }).exec(); }
错误2:findOne 校验永远提示邮箱已占用、且数据仍写入数据库的解决方法
原因1:查询条件书写错误
你当前写的User.findOne({value})是对象简写语法,等价于User.findOne({ value: value }),即查询集合中value字段等于传入邮箱的记录,与你实际存储邮箱的email字段不匹配。
Mongoose 7.x.x 版本开始默认开启strictQuery配置,查询不存在的字段会被自动过滤,你的查询实际等价于User.findOne({}),会永远返回库中第一条用户记录,因此永远判定为邮箱已存在。
修改查询条件即可:
.custom(value => { return User.findOne({ email: value }).then(user => { if (user) { return Promise.reject('E-mail already in use'); } }); })
原因2:路由逻辑未先判断校验结果就执行写库
express-validator的校验规则不会自动拦截请求,你需要在路由处理逻辑最开头调用validationResult判断校验结果,存在错误时直接返回,不执行后续写库逻辑,示例如下:
const { validationResult } = require('express-validator'); // 注册路由示例 app.post('/register', // 此处放置你的校验规则 check("email").custom(/* 上面的自定义校验逻辑 */), (req, res) => { // 首先校验参数合法性 const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } // 校验通过后再执行用户数据写库逻辑 // ... 你的业务代码 } )
内容的提问来源于stack exchange,提问作者Rajanboy
相关产品推荐
相关产品推荐

