Mongoose minlength验证返回错误提示异常求助
问题原因及解决方法
核心原因
你遇到的问题大概率是密码在存入数据库前被加密(比如使用bcrypt这类工具),加密后的字符串长度远超你设置的15位上限,触发了maxlength验证,所以返回了对应的"shorter"提示,而非你预期的minlength提示。比如bcrypt生成的哈希字符串长度通常是60位左右,远大于15位,这时候Mongoose会触发maxlength的错误提示。
解决步骤
1. 检查密码处理逻辑
查看你的用户创建代码,确认是否对password字段做了加密操作。典型的加密代码类似:
const bcrypt = require('bcrypt'); // 创建用户时的处理 const user = new User({ name: req.body.name, password: bcrypt.hashSync(req.body.password, 10) // 加密后长度远超15位 }); user.save()...
2. 调整Mongoose验证规则
如果确实需要加密密码,修改password字段的maxlength限制:
- 直接移除
maxlength规则(因为加密后的哈希长度固定,无需限制原密码的最大长度) - 或者将
maxlength设置为加密后哈希的实际长度(比如bcrypt哈希是60位)
password: { type: String, required: true, minlength: [6, 'you really should use a longer password'], // 移除maxlength,或者改为对应哈希长度 // maxlength: [60, 'invalid password hash length'] }
3. 业务层提前校验原密码长度(可选)
如果想在加密前就验证原密码的长度,可以在业务逻辑层先做校验,再执行加密:
const { name, password } = req.body; // 先验证原密码长度 if (password.length < 6) { return res.status(400).send('you really should use a longer password'); } if (password.length > 15) { return res.status(400).send('you really should use a shorter password'); } // 再加密并存入数据库 const hashedPassword = bcrypt.hashSync(password, 10); const user = new User({ name, password: hashedPassword }); await user.save();
4. 其他排查点
- 确认POST请求发送的密码确实是小于6位,而非前端输入错误(比如误输入超长字符串)
- 升级Mongoose到最新稳定版本,排除版本bug导致的验证逻辑异常
内容的提问来源于stack exchange,提问作者A Random String of Numbers
相关产品推荐
相关产品推荐

