我希望我的 pre('save') mongoose 函数只运行一次

Posted

技术标签:

【中文标题】我希望我的 pre(\'save\') mongoose 函数只运行一次【英文标题】:I want my pre('save') mongoose function to operate only once我希望我的 pre('save') mongoose 函数只运行一次 【发布时间】:2020-07-02 18:19:26 【问题描述】:

我不知道标题中的确切要求是否可能,但如果不是;我真的很感激另一个解决方案。

我有这种猫鼬的预存方法

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();
    );
  );
);

当我保存新用户(所有者)时,已成功创建哈希并且一切都很好>

登录时出现问题。当我登录时,我使用如下 mongoose 自定义方法生成 jwt

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) 函数再次运行,以便为密码字段生成一个新的哈希。

当我再次尝试登录时,密码已经从第一次登录生成令牌时调用预保存哈希函数更改。

有什么办法可以解决这个问题?

【问题讨论】:

【参考方案1】:

您可以在“密码”字段中使用isModified 方法。

我就是这样用的,只有修改密码属性才运行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();
  
);

【讨论】:

以上是关于我希望我的 pre('save') mongoose 函数只运行一次的主要内容,如果未能解决你的问题,请参考以下文章

将pre_save信号更改为post_save?Django

如何使用 Django 信号(Pre_save,Post_save)从“B”模型的 ImageField 设置“A”模型的 ImageField

何时在 django 中使用 pre_save、save、post_save?

Django:如何使用 pre_save 信号更新模型实例?

Mongoose .pre('save') 不会触发

无法使用 pre_save 信号在 django 模型中保存相关对象