Mongoose Schema验证失效求助:username字段未自动转小写
排查Mongoose Schema中lowercase转换失效的问题
我来帮你分析下可能的原因,一步步排查:
确认是否触发了Mongoose的转换逻辑
Mongoose的lowercase: true选项是在文档保存阶段(通过save()方法)或者验证阶段生效的。如果你只是创建了User实例但没有调用user.save(),那这个转换是不会自动执行的。比如你的路由里需要补充保存逻辑:router.post('/putname', function(req, res){ var user = new User({ username: req.body.username }); // 必须调用save才会触发lowercase转换 user.save() .then(savedUser => { console.log(savedUser.username); // 这里应该是小写格式 res.send(savedUser); }) .catch(err => res.status(400).send(err)); });使用更新类操作时,需手动开启验证器
要是你用的是findOneAndUpdate、updateOne这类更新方法,Mongoose默认不会运行Schema的转换和验证规则,需要在选项里加上runValidators: true:User.findOneAndUpdate( { _id: userId }, { username: req.body.username }, { runValidators: true, new: true } // new: true 用于返回更新后的文档 ) .then(updatedUser => res.send(updatedUser)) .catch(err => res.status(400).send(err));检查Mongoose版本是否过旧
某些非常老的Mongoose版本(比如v4.x之前)对lowercase这类字符串选项的支持可能有问题,建议升级到稳定的v5+或v6+版本,避免版本兼容问题。用明确的大写用户名测试
有时候可能你测试用的用户名本来就是小写,导致误以为转换没生效,换个大写的用户名(比如"JOHNDOE")再测试,看看保存后是不是变成了"johndoe"。
如果以上都排查过还是有问题,可以把路由里创建/保存用户的完整代码贴出来,我再帮你进一步分析~
内容的提问来源于stack exchange,提问作者Ankit
相关产品推荐
相关产品推荐

