节点js重置用户的密码

早上好,我正在实现一个NodeJs函数来重置一个特定用户的密码。 我将所有用户保存在一个名为Account的本地MongoDb集合中,并使用以下模式:

var Account = new Schema({ username: { type: String, trim: true, unique: true, index: true, lowercase: true, "default": "", validate: [validateLocalStrategyProperty, "Please fill in your email"], match: [/.+\@.+\..+/, "Please fill a valid email address"] }, password: { type: String, "default": "", validate: [validateLocalStrategyPassword, "Password should be longer"] }, role: { type: [ { type: String, "enum": [ C.ROLE_SUPERADMIN, C.ROLE_ADMIN, C.ROLE_USER ] } ], "default": [C.ROLE_ADMIN] }, registrationDate: { type: Date, "default": new Date } }); 

所以,当一个新用户在系统中注册自己时,我保存到DB中并使用PassportJS来validation他的数据,如下所示:

 // Post registration userController.doRegister = function(req, res) { Account.register(new Account({username : req.body.username, password: req.body.password, role: req.body.role}), req.body.password, function(err, user) { if (err) { req.flash('error', 'Error: ' + err.message); return res.render('login/register', { roles: roles , title: 'Register'}); } passport.authenticate('local')(req, res, function () { req.session.save(function (err) { if (err) { req.flash('error', 'Error: ' + err.message); return next(err); } console.log("NEW USER" + "\n Email:" + req.user.username + "\n Psw: " + req.user.password + "\n Role: " + req.user.role); res.redirect('/login'); }); }); }); }; // Post login userController.doLogin = function(req, res, err) { passport.authenticate('local', function(err, user, info) { if (err) { return next(err); } //error exception // user will be set to false, if not authenticated if (!user) { req.flash('error', 'Error: ' + info.message); res.render('login/login', { title : 'Login'}); } else { // if user authenticated maintain the session req.logIn(user, function() { // do whatever here on successful login req.session.save(function (err) { if (err) { req.flash('error', 'Error: ' + err.message); return res.render('login/login'); } console.log("LOGGED IN USER" + "\n Email:" + req.user.username + "\n Psw: " + req.user.password + "\n Role: " + req.user.role); res.redirect('/'); }); }) } } )(req, res, function () {}); }; 

直到现在一切正常,运作良好。 我现在正在写一个函数来重置用户的密码,这是方法:

 // PUT user password panelController.resetProfile = function(req, res) { Account.findOne({_id: req.params.id}, function(err, user) { if (!user) { req.flash('error', 'Error: user not found.'); return res.redirect('/' + req.params.redirect); } console.log("BEFORE USER: " + user.username + ' PSW: ' + user.password); user.password = 'admin'; user.save(function(err) { req.flash('info', 'Info: ' + user.username + '\'s password has been reset to \'admin\'.'); console.log("AFTER USER: " + user.username + ' PSW: ' + user.password); res.redirect('/' + req.params.redirect); }); }); }; 

它的工作,显然,期待在控制台输出和数据库收集。 事实上。 假设我们想要将密码重置为“admin”的用户是test@test.com,他的当前密码是“qwerty”。 我调用该方法后,控制台输出是:

 BEFORE USER: test@test.com PSW: $2a$10$gWNJTJW63sddcF9QGXAfKuDBmG.0S6WoH/VD4CGgC8BfyBPNvYJty AFTER USER: test@test.com PSW: $2a$10$PULutMVzQPnShuZ5ae3T4edhvdoKKHBIwDXyQ5YfAIoONtJdQDTim 

正如你所看到的,散列密码已经改变了,数据库中的密码字段也改变了。 问题是,当我尝试用新密码“admin”用户test@test.comlogin系统时,系统给我一个错误,说明密码不正确,当我尝试login时旧密码“qwerty”,它让我进来。它看起来像它重置密码,但系统保留匹配的旧密码。 哪里我错了?

如果您需要更多的信息,请让我知道,谢谢!