Mongoose创建userDB实例时userRole为undefined及schema校验报错如何解决
问题原因
有两个核心错误导致你遇到的问题:
- 字段名不匹配:你的
userSchema中定义的角色关联字段是usersRoles,但你在创建newUser实例时,用了不存在的字段名userRole赋值。Mongoose默认会自动过滤Schema中未定义的字段,你赋值的userRole不会被存入文档实例,所以访问newUser.userRole自然返回undefined,同时usersRoles字段没有被赋值,就触发了必填校验错误。 - 字段类型不匹配:
userSchema中的usersRoles字段类型是ObjectId,关联的是角色表的主键,而你直接传入了字符串类型的角色名admin,哪怕字段名写对也无法通过校验。
解决方法
按如下步骤修改代码即可:
- 先根据前端传入的角色名,到角色表查询对应的角色文档,拿到对应的
_id - 创建用户实例时,字段名使用和Schema一致的
usersRoles,赋值为查询到的角色_id
示例代码如下:
// 先引入你定义的角色模型,注意替换成你实际的文件路径 const userRolesModel = require('../models/userRolesModel'); // 你的原有参数获取逻辑 const username = req.body.username; const _userRole = req.body.userRole; const password = req.body.password; const password2 = req.body.password2; // 新增:先查询角色对应的ObjectId const existRole = await userRolesModel.findOne({ userRole: _userRole }); if (!existRole) { // 自定义角色不存在的错误处理逻辑,比如返回客户端错误响应 return res.status(400).json({ error: '传入的用户角色不合法' }); } // 修正字段名,传入正确的角色_id let newUser = new userDB({ username: username, usersRoles: existRole._id, password: password });
修改后newUser.usersRoles就会有正确的值,校验也会正常通过。
内容的提问来源于stack exchange,提问作者Hesham Eldawy
相关产品推荐
相关产品推荐

