2017-02-16 2 views
1

У меня есть база данных в MongoDB/Mongoose, и у меня есть коллекция пользователей, которые я использую как для аутентификации, так и как список контактов для отображения в интерфейсе.Как удалить свойство из прототипа в массиве объектов из MongoDB?

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

Так что у меня что-то вроде этого

readAll(req, res, next) { 
    User.find() 
    .then(users => { 
     users.forEach(user => { 
     delete user.password; 
     }); 
     res.send(users); 
    }) 
    .catch(next) 
}, 

Это сейчас работает; хотя delete user.password возвращает true, он ничего не удаляет. Поскольку пользователь - это класс, который я определил как ModelSchema в Mongoose, пароль является частью прототипа, поэтому его нельзя удалить таким образом.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete

Я пытался сделать что-то вроде этого delete User.prototype.password; , но он ничего не делает.

Как это сделать? Благодаря

ответ

1

На уровне запросов, вы можете использовать projection для выбора/отмены выбора полей вы хотите т.е.

readAll(req, res, next) { 
    User.find({}, '-password') 
    .then(users => { 
     res.send(users); 
    }) 
    .catch(next) 
}, 

или с помощью запроса select() метод

readAll(req, res, next) { 
    User.find().select('-password') 
    .then(users => { 
     res.send(users); 
    }) 
    .catch(next) 
}, 

Другой подход было бы изменить атрибут select поля на уровне определения схемы, например:

email: { type: String }, 
password: { 
    type: String, 
    select: false 
}, 
... 

и запрос в обычном режиме:

readAll(req, res, next) { 
    User.find() 
    .then(users => { 
     res.send(users); 
    }) 
    .catch(next) 
}, 
+1

Я не знала, о 'выбрать: false', это полностью имеет смысл, спасибо! – David

Смежные вопросы