Node.js 为什么密码和盐自动在平均堆栈中?

Node.js 为什么密码和盐自动在平均堆栈中?,node.js,express,mongoose,mean-stack,meanjs,Node.js,Express,Mongoose,Mean Stack,Meanjs,在这里,我试图验证用户模块中的手机号码。我已经创建了令牌,并将其发送给用户,但每当用户尝试使用特定令牌进行验证时,“密码”和“salt”都会自动更改。如何避免这种情况?有人帮帮我。。这里我只想更新 user.Mobileverification = 'verfied'; user.Mobileverificationcode = undefined; user.mobileVerificationExpires = undefined; 上面三个变量都变了,但我不知道为什么密码和salt都变了

在这里,我试图验证用户模块中的手机号码。我已经创建了令牌,并将其发送给用户,但每当用户尝试使用特定令牌进行验证时,“密码”和“salt”都会自动更改。如何避免这种情况?有人帮帮我。。这里我只想更新

user.Mobileverification = 'verfied';
user.Mobileverificationcode = undefined;
user.mobileVerificationExpires = undefined;
上面三个变量都变了,但我不知道为什么密码和salt都变了

我在下面给出了我的路线:

app.route('/auth/mobilereset/:token').get(users.mobileresetResetToken);
app.route('/auth/mobilereset/:token').post(users.mobilereset);
控制器:

exports.mobileresetResetToken = function(req, res) {
    User.findOne({
        Mobileverificationcode :req.params.token,
        mobileVerificationExpires: {
            $gt: Date.now()
         }
        // resetPasswordToken: req.params.token,
        // resetPasswordExpires: {
            // $gt: Date.now()
        // }
    }, function(err, user) {
        if (!user) {
            res.send({
                message: 'Invalid token'
            });


        } else {

            console.log('working fine');
        }
    });
};



exports.mobilereset = function(req, res, next) {


    async.waterfall([

        function(done) {
            User.findOne({
                Mobileverificationcode: req.params.token,
                mobileVerificationExpires: {
                    $gt: Date.now()
                }
            }, function(err, user) {
                if (!err && user) {

                        user.Mobileverification = 'verfied';
                        user.Mobileverificationcode = undefined;
                        user.mobileVerificationExpires = undefined;

                        user.save(function(err) {
                            if (err) {
                                return res.status(400).send({
                                    message: errorHandler.getErrorMessage(err)
                                });
                            } else {
                                req.login(user, function(err) {
                                    if (err) {
                                        res.status(400).send(err);
                                    } else {
                                        // Return authenticated user 
                                        res.json(user);

                                        done(err, user);
                                    }
                                });
                            }
                        });

                } else {
                    return res.status(400).send({
                        message: 'reset token is invalid or has expired.'
                    });
                }
            });
        },

    ], function(err) {
        if (err) return next(err);
    });
};
型号:

var UserSchema = new Schema({

    username: {
        type: String,
        unique: 'testing error message',
        required: 'Please fill in a username',
        trim: true
    },
    password: {
        type: String,
        default: '',
        // validate: [validateLocalStrategyPassword, 'Password should be longer']
    },
    email: {
        type: String,
        trim: true,
        default: '',
        // validate: [validateLocalStrategyProperty, 'Please fill in your email'],
        // match: [/.+\@.+\..+/, 'Please fill a valid email address']
    },
    Mobilenumber: {
        type: String,
        default: ''
    },


    roles: {
        type: [{
            type: String,
            enum: ['user', 'admin']
        }],
        default: ['user']
    },
    salt: {
        type: String
    },
    provider: {
        type: String,
        required: 'Provider is required'
    },
    providerData: {},
    additionalProvidersData: {},

    updated: {
        type: Date
    },
    created: {
        type: Date,
        default: Date.now
    },
    /* For reset password */
    Mobileverificationcode: {
        type: String,
    },
    mobileVerificationExpires: {
        type: Date
    },
    Mobileverification: {
        type: String,
        trim: true,
        default: 'Not Verified',
    },
    resetPasswordToken: {
        type: String
    },
    resetPasswordExpires: {
        type: Date
    }
});

我不知道您是否删除了此项,但在MEAN.js用户模型中,您必须小心使用以下代码块:

/**
 * Hook a pre save method to hash the password
 */
UserSchema.pre('save', function (next) {
   if (this.password && this.isModified('password')) {
     this.salt = crypto.randomBytes(16).toString('base64');
    this.password = this.hashPassword(this.password);
   }

  next();
});
将在保存用户数据之前调用。这可能就是为什么密码和盐一直在变化。。。您正在mobile.reset()中调用user.save,上面的代码块仍然存在

更新: 一种可能的方法是:

/**
 * Hook a pre save method to hash the password
 */
UserSchema.pre('save', function (next) {
   if(!this.isModified('Mobileverification') && !this.isModified('Mobileverificationcode') && !this.isModified('mobileVerificationExpires')) {
       if (this.password && this.isModified('password')) {
         this.salt = crypto.randomBytes(16).toString('base64');
         this.password = this.hashPassword(this.password);
       }
    }

  next();
});

但是,它可能需要一些调整,例如根据您的需要改进此预保存挂钩,并测试密码更改和移动验证,以查看是否没有任何损坏。

如果不更改salt和密码,我如何仅更改MobileFicationCode、MobileFicationExpires、MobileFication