Я хочу, чтобы моя функция pre ('save') mon goose работала только один раз - PullRequest
0 голосов
/ 22 марта 2020

Я не знаю, возможен ли точный запрос в заголовке, но если нет; я был бы очень признателен за альтернативное решение.

У меня есть этот метод предварительного сохранения mon goose

ownerSchema.pre("save", function(next) {


 const owner = this;
  bcrypt.genSalt(10, function(err, salt) {
    bcrypt.hash(owner.password, salt, function(err, hash) {
      // Store hash in your password DB.
      owner.password = hash;
      next();
    });
  });
});

Когда я сохраняю нового пользователя (владельца), ха sh создается успешно и все хорошо>

Проблема возникает при входе в систему. при входе в систему я генерирую jwt с помощью пользовательского метода mon goose, как показано ниже

ownerSchema.methods.generateToken = function(cb) {
  var owner = this;
  var token = jwt.sign(
    {
      _id: owner._id,
      username: owner.username,

      email: owner.email,
      category: owner.category === 0 ? false : true,
      phones: owner.phones,
      address: owner.address
    },
    config.SECRET,
    { expiresIn: "1h" }
  );
   owner.token= token;

  owner.save(function(err,owner){
    if(err) return cb(err);
    cb(null,owner);
  })
};

, как вы видите, я генерирую токен, чтобы отправить его в «res», и в то же время добавляю новый токен в запись в базе данных. все работает нормально до сих пор, и ответ возвращается успешно>

НО !! в то время как я выполнил save () в функции создания токена, чтобы сохранить токен >>, предыдущая функция pre (save) снова запустилась, так что для поля пароля генерируется новый ха sh.

когда я попробуйте войти снова, пароль уже изменился с вызова функции хеширования перед сохранением при генерации токена при первом входе в систему.

Есть ли обходной путь для решения этой проблемы?

1 Ответ

1 голос
/ 22 марта 2020

Вы можете использовать isModified метод в вашем поле 'password'.

Я использую его таким образом, запускать bcrypt, только если свойство пароля было изменено:

UserSchema.pre('save', function (next) {
  var user = this;

  if (user.isModified('password')) {
    bcrypt.genSalt(10, (err, salt) => {
      bcrypt.hash(user.password, salt, (err, hash) => {
        user.password = hash;
        next();
      });
    });
  } else {
    next();
  }
});
...