猫鼬:findOneAndUpdate预钩子不起作用

时间:2018-09-24 15:48:52

标签: mongodb mongoose

我已经搜索了这个问题,发现的所有解决方案实际上都无效。我目前正在使用此函数对密码进行加密,然后再将其存储在数据库中,但是即使在登录this时更改了值,也不会像在函数中更改密码那样存储密码。

UserSchema.pre('findOneAndUpdate', function(next) {
  const update = this.getUpdate();
  if (!_.isEmpty(update.password)) {
    bcrypt.genSalt(10, (err, salt) => {
      bcrypt.hash(update.password, salt, (err, hash) => {
        this.getUpdate().password = hash;
        next();
      })
    })
  }
  next();
});

我也尝试过更改this._update.password的值,但是它也不起作用。我也尝试过使用$set甚至使用post钩子,但是它们都没有帮助。我在做什么错了?

2 个答案:

答案 0 :(得分:2)

我刚刚在本地进行了测试:

pre

和这个AuthorSchema.pre('findOneAndUpdate', function(next) { this._update.password = 'BBB' next(); }); 钩子:

BBB

密码已另存为type: String

作者模式的密码字段为next()

我正在 3.6.5

在您的bcrypt情况下,您还有一个额外的else而没有UserSchema.pre('findOneAndUpdate', function(next) { const update = this.getUpdate(); if (!_.isEmpty(update.password)) { bcrypt.genSalt(10, (err, salt) => { bcrypt.hash(update.password, salt, (err, hash) => { this.getUpdate().password = hash; next(); }) }) } else { next(); } }); ,这使您感到困惑……应该是:

  #!/bin/bash

DATE=`date +%Y%m%d`
LOGPATH="/var/log/kbci-ocr"
LOGDIR="${LOGPATH}/LOG-${DATE}"
LOGERR="${LOGDIR}/err.log"

docker ps --format {{.ID}},{{.Image}} > docker_running.txt
file=docker_running.txt
for i in `cat $file`
do
    echo "Checking log dir presence"
    if [ ! -d $LOGDIR ]; then
        mkdir -p $LOGDIR;
        echo "Log dir created"
    else
        echo "Log dir exist"
    fi
    echo "Creating log dir for the current log saving iteration"
    container=$(echo $i | cut -d"," -f1)
    TARGETDIR="${LOGDIR}/${container}+$(date +%Y%m%d_%H%M%S)"
    mkdir -p $TARGETDIR
    echo "Copying log files from container ${container}"
    imagename=$(echo $i | cut -d"," -f2 | cut -d"/" -f4 | cut -d":" -f1)
    docker cp ${container}:/app/'\${imagename}_app.json' ${TARGETDIR}
    docker cp ${container}:/app/'\${imagename}_errors.json' ${TARGETDIR}
    docker cp ${container}:/app/'\${imagename}_sql.json' ${TARGETDIR}
    docker cp ${container}:/app/'\${imagename}_webHost.json' ${TARGETDIR}
done

rm -rf docker_running.txt

答案 1 :(得分:0)

user.pre('findOneAndUpdate', function(next){
    const user=this.getUpdate().$set;
    if(!user.password){
      next();
    }
    else{
    bcrypt.genSalt(10, function (err, salt) {
        if (err) {
          return next(err);
        }
        bcrypt.hash(user.password, salt, null, function (err, hash) {
          if (err) {
            return next(err);
          }
          user.password = hash;
           next();
        });
    });
  }
})