JS角色错误TypeError:无法读取属性' push'未定义的

时间:2018-04-29 13:05:26

标签: javascript arrays json node.js mongodb

我在网站的管理面板中设置角色时遇到了一些问题。我设置的角色是mmUser,mmMerchant,mmAdmin

当用户注册时,他们自动设置为mmUser,在管理面板中我试图将它们设置为mmMerchant,现在我可以手动执行MongoDB设置。奇怪的是,我可以通过面板将它们从商家降级到mmUser,但不能将它们作为商家。

任何想法?

Controller.get('/make-merchant/:id/', function(req, res, next){
    let id = req.params.id;

    Collections
    .Schemas
    .Users
    .find()
    .then(results => {
        results.roles.push('mmMerchant');
        results.save()
        .then(user=>{
            res.redirect('/management/users/');
        })
        .catch(next)
    })
    .catch(next)
});

错误日志说明了这个

TypeError: Cannot read property 'push' of undefined
Cannot read property 'push' of undefined
TypeError: Cannot read property 'push' of undefined
    at Collections.Schemas.Users.find.then.results (D:\pre200\pre\routes\management\users.js:69:22)
    at process._tickCallback (internal/process/next_tick.js:103:7)

最新日期代码

Controller.get('/make-merchant/:id/', function(req, res, next){
    let id = req.params.id;

    Collections
    .Schemas
    .Users
    .find({_id: id })
    .then(results => {
       results[0].roles.push('mmMerchant');
        results.save()
        .then(user=>{
            res.redirect('/management/users/');
        })
        .catch(next)
    })
    .catch(next)
});

2 个答案:

答案 0 :(得分:0)

Model.find将返回一个文档数组,因此它将是results[0].roles

您可以使用Model.findOne或此处Model.findById这只会返回一个文档(或null)。

如果可能,您还可以使用Model.findByIdAndUpdate

等内容直接更新文档

例如,您可以使用$push运算符:

Model.findByIdAndUpdate(id, { 
  $push: { roles: 'mmMerchant' } 
})

替代方案是$addToSet,这可以防止重复。

答案 1 :(得分:0)

更新

我知道已经修复了这个错误,对于遭受同样错误的其他人来说。

这是我的代码。

Controller.get('/make-merchant/:id/', function(req, res, next){
    let id = req.params.id;

    Collections
    .Schemas
    .Users
    .findOne({_id: id})
    .then(results => {
             let merchantIndex = results.roles.indexOf('mmUser');

        if(merchantIndex > -1){
            results.roles.push('mmMerchant');
        }

        results.save()
        .then(user=>{
            res.redirect('/management/users/');

        })
        .catch(next)
    })
    .catch(next)
});