Создать хешированный пароль в findOneAndUpdate - PullRequest
0 голосов
/ 28 июня 2018

Вот мой запрос для findOneAndUpdate

  const { email, password, id } = req.body
  Artist.findOneAndUpdate({ _id: id }, { $set: req.body }).then((artist) => {
      return res.json({
        success: true,
        message: "Invitation sent."
      });
  })

А вот и моя схема

var artistSchema = new mongoose.Schema({
  name: { type: String, default: '' },
  password: { type: String, default: '' }
})
artistSchema.pre('findOneAndUpdate', function (next) {
    console.log('------------->>>>>> findOneAndUpdate: ');
    console.log(this.password) // why undefined?
    next();
});

Я хочу создать хешированный пароль, когда пользователь обновляет данные

Ответы [ 3 ]

0 голосов
/ 28 июня 2018
let crypto = require('crypto');
let mongoose = require('../mongoose'),
    Schema = mongoose.Schema;

Тогда Схема

let schema = new Schema({
    name: { 
        type: String, 
        default: '' 
    },
    hashedPassword: {
        type: String,
        required: true
    },
    salt: {
        type: String,
        required: true
    }
});

Тогда методы и виртуалы

schema.methods.encryptPassword = function(password){
    return crypto.createHmac('sha1', this.salt).update(password).digest('hex');
};

schema.virtual('password').set(function(password){
    this._plainPassword = password;
    this.salt = Math.random() + '';
    this.hashedPassword = this.encryptPassword(password);
}).get(function(){ return this._plainPassword; });

Вы можете проверить пароль таким образом

schema.methods.checkPassword = function(password){
    return this.encryptPassword(password) === this.hashedPassword;
};

Модуль экспорта

module.exports.Artist = mongoose.model('Artist', schema);

Тогда просто сохраните как раньше

const { email, password, id } = req.body;
Artist.findOneAndUpdate({ _id: id }, { $set: req.body }).then((artist) => {
  return res.json({
    success: true,
    message: "Invitation sent."
  });
});

Но я советую вам также использовать статику. Например:

schema.statics.updateUser = function (data){
    // your code
}

И тогда вы можете использовать

Artist.updateUser(req.body).then((res) => {
    // response
})
0 голосов
/ 20 марта 2019

Ответ: Напишите console.log(JSON.stringify(this._update));

Мое решение для проверки пустого пароля.

userSchema.pre('findOneAndUpdate', function() {
    console.log(JSON.stringify(this._update));
    if (this._update.password.length == 0) {
        this._update = {
            "fullname": this._update.fullname
        };
    }
    else {
        this._update = {
            "fullname": this._update.fullname,
            "password": bcrypt.hashSync(this._update.password, bcrypt.genSaltSync(8), null)
        };
    }
});
0 голосов
/ 28 июня 2018
const { email, password, id } = req.body;
Artist.findByIdAndUpdate(id, { $set: req.body }).then(artist => {
  return res.json({
    success: true,
    message: "Invitation sent."
  });
});

Пример с bcrypt

var artistSchema = new mongoose.Schema({
  name: { type: String, default: "" },
  password: { type: String, default: "" }
});
artistSchema.pre("update", function(next) {
  bcrypt.hash(this.password, 10, function(err, hash) {
    if (err) return next(err);
    this.password = hash;
    next();
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...