JS角色设置报错:TypeError: Cannot read property 'push' of undefined 求助
解决思路:用户角色升级失败及
push未定义报错问题 咱们一步步拆解你的问题,梳理解决思路:
首先,你遇到的TypeError: Cannot read property 'push' of undefined是核心线索——这说明代码尝试对一个未初始化或非数组类型的roles字段调用push方法,而降级操作能正常执行,恰好验证了这一点:降级时用户已有mmMerchant角色,roles字段是存在的数组,所以不会触发报错。
1. 先定位问题根源
先去MongoDB里查看一个mmUser身份的用户文档,重点看roles字段的状态:
- 是不是根本没有
roles字段? - 或者是存储为单个字符串(比如
"mmUser")而不是数组(比如["mmUser"])?
注册时自动设为mmUser的逻辑,大概率是把roles存成了单个值甚至没初始化,而升级接口直接调用user.roles.push('mmMerchant'),自然会因为roles不存在/不是数组报错。
2. 修复升级接口的代码逻辑
针对你的/make-merchant/:id/控制器,需要先确保roles是一个合法数组,再执行添加角色的操作。这里提供修改后的示例代码:
Controller.get('/make-merchant/:id/', function(req, res) { User.findById(req.params.id, function(err, user) { if (err) return res.status(500).send(err); // 第一步:初始化或标准化roles数组 if (!user.roles) { // 如果roles字段不存在,直接初始化为数组 user.roles = []; } else if (!Array.isArray(user.roles)) { // 如果原先是字符串格式,转换为数组(兼容历史数据) user.roles = [user.roles]; } // 第二步:去重添加mmMerchant角色 if (!user.roles.includes('mmMerchant')) { user.roles.push('mmMerchant'); } // 可选:如果升级后需要保留mmUser角色,无需额外操作;如果需要替换,改成 user.roles = ['mmMerchant'] user.save(function(saveErr) { if (saveErr) return res.status(500).send(saveErr); res.send('用户已成功升级为mmMerchant角色'); }); }); });
3. 统一注册时的角色格式
为了避免后续再出现类似问题,建议修改用户注册逻辑,把mmUser角色统一存为数组格式:
// 注册时的角色赋值逻辑,从单个字符串改成数组 user.roles = ['mmUser'];
4. 验证降级逻辑的兼容性
既然降级操作能正常执行,说明降级代码已经处理了roles数组的合法性(比如用filter移除角色),可以参考降级逻辑的写法,确保升级和降级的角色处理逻辑一致。
5. 测试验证
修改代码后,找一个测试用户:
- 从
mmUser尝试升级为mmMerchant,确认不再报错 - 检查MongoDB文档,确认
roles字段变成["mmUser", "mmMerchant"](或你期望的格式) - 再尝试降级回
mmUser,验证功能正常
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

