Ошибка с ролями JS TypeError: Невозможно прочитать свойство «push» из неопределенного - PullRequest
0 голосов
/ 29 апреля 2018

У меня небольшая проблема с настройкой ролей в панели администратора моего сайта. роли, которые я установил: 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 голосов
/ 09 мая 2018

Обновлено

я знаю, что исправил эту ошибку, для всех, кто страдает от той же ошибки.

вот мой код.

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)
});
0 голосов
/ 29 апреля 2018

Model.find вернет массив документов, поэтому будет results[0].roles.

Вы бы использовали Model.findOne или здесь Model.findById, при этом будет возвращен только один документ (или null).

Если возможно, вы также можете обновить документ напрямую, например, Model.findByIdAndUpdate

Например, вы можете использовать оператор $push:

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

Альтернативой будет $addToSet, это предотвратит дублирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...