.populate('user' , '-password')
http://mongoosejs.com/docs/populate.html
Ответ JohnnyHKs с использованием параметров схемы, вероятно, является тем, как это сделать.
Также обратите внимание, что query.exclude()
существует только в ветке 2.x.
При использовании password: { type: String, select: false }
вы должны иметь в виду, что он также будет исключать пароль, когда он нам понадобится для аутентификации. Поэтому будьте готовы обращаться с ним, как хотите.
Это больше похоже на исходный вопрос, но на этот вопрос я столкнулся с попыткой решить мою проблему ...
А именно, как отправить пользователя обратно клиенту в пользователе .save () без поля пароля.
Случай использования: пользователь приложения обновляет информацию / настройки своего профиля от клиента (пароль, контактную информацию, whatevs). Вы хотите отправить обновленную информацию о пользователе обратно клиенту в ответ, как только он успешно сохранит mongoDB.
User.findById(userId, function (err, user) {
// err handling
user.propToUpdate = updateValue;
user.save(function(err) {
// err handling
/**
* convert the user document to a JavaScript object with the
* mongoose Document's toObject() method,
* then create a new object without the password property...
* easiest way is lodash's _.omit function if you're using lodash
*/
var sanitizedUser = _.omit(user.toObject(), 'password');
return res.status(201).send(sanitizedUser);
});
});
Решение состоит в том, чтобы никогда не хранить незашифрованные пароли. Вы должны использовать пакет, например [bcrypt]
1 или [password-hash]
2 .
Пример использования для хеширования пароля:
var passwordHash = require('password-hash');
var hashedPassword = passwordHash.generate('password123');
console.log(hashedPassword); // sha1$3I7HRwy7$cbfdac6008f9cab4083784cbd1874f76618d2a97
Пример использования для проверки пароля:
var passwordHash = require('./lib/password-hash');
var hashedPassword = 'sha1$3I7HRwy7$cbfdac6008f9cab4083784cbd1874f76618d2a97';
console.log(passwordHash.verify('password123', hashedPassword)); // true
console.log(passwordHash.verify('Password0', hashedPassword)); // false
Вы можете добиться этого, используя схему, например:
const UserSchema = new Schema({/* */})
UserSchema.set('toJSON', {
transform: function(doc, ret, opt) {
delete ret['password']
return ret
}
})
const User = mongoose.model('User', UserSchema)
User.findOne() // This should return an object excluding the password field
Вы можете изменить поведение по умолчанию на уровне определения схемы с помощью атрибута select
поля:
password: { type: String, select: false }
Затем вы можете потянуть его по мере необходимости в find
и populate
вызывают выбор поля в качестве '+password'
. Например:
Users.findOne({_id: id}).select('+password').exec(...);
Edit:
После попытки обоих подходов я обнаружил, что исключающий всегда подход не работает для меня по какой-то причине с использованием паспортно-локальной стратегии, не знаю почему.
Итак, это то, что я в конечном итоге использовал:
Blogs.findOne({_id: id})
.populate("user", "-password -someOtherField -AnotherField")
.populate("comments.items.user")
.exec(function(error, result) {
if(error) handleError(error);
callback(error, result);
});
Нет ничего плохого в том, что исключение всегда подходит, он почему-то не работал с паспортом, мои тесты сказали мне, что в факт, что пароль был исключен / включен, когда я захотел. Единственная проблема с включением всегда заключается в том, что мне в основном нужно пройти каждый вызов, который я делаю в базе данных, и исключить пароль, который является большой работой.
После нескольких отличных ответов Я обнаружил, что есть два способа сделать это: «всегда включать и исключать иногда» и «всегда исключать и включать иногда»?
Пример обоих:
Включить всегда, но иногда исключаю пример:
Users.find().select("-password")
или
Users.find().exclude("password")
Экслюд всегда всегда, но иногда включает пример:
Users.find().select("+password")
, но вы должны определить в схема:
password: { type: String, select: false }
.select("+field")
, он приносит только __id
, хотя .select("-field")
отлично выделяет поле, которое я хочу
– Renato Gama
13 February 2013 в 04:19
select: false
является обязательным
– Renato Gama
13 February 2013 в 04:24
Предполагая, что ваше поле пароля является «паролем», вы можете просто сделать:
.exclude('password')
Здесь есть более обширный пример
. Это сфокусировано на комментариях, но это тот же самый принцип в игре.
Это то же самое, что использовать проекцию в запросе в MongoDB и передачу {"password" : 0}
в поле проекции. См. здесь
Blogs.findOne({ _id: id }, { "password": 0 }).populate("user").exec()
User.find().select('-password')
- правильный ответ. Вы не можете добавить select: false
на Схеме, поскольку он не будет работать, если вы хотите войти в систему.