我正在为应用程序创建一个忘记密码功能,我只需更新用户密码(使用bcrypt进行哈希处理)。但是我不知道如果用户不存在我的代码到目前为止如何显示。我知道如何记录它,并且我熟悉req.flash以获得成功,但是我不知道如果用户不存在则设置为req.flash错误的条件。
这是我的代码:
路线/用户:
var express = require('express');
var router = express.Router();
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var User = require('../models/user');
router.post('/forgot', function(req, res){
var username = req.body.username;
var password = req.body.password;
var password2 = req.body.password2;
// Validation
req.checkBody('username', 'Username is required').notEmpty();
req.checkBody('password', 'Password is required').notEmpty();
req.checkBody('password2', 'Passwords do not match').equals(req.body.password);
var errors = req.validationErrors();
if(errors){
res.render('forgot',{
errors:errors
});
}
else {
User.changePassword(username, password);
req.flash('success_msg', 'Your password has been reset. Please login.');
res.redirect('/users/login');
}
});
module.exports = router;
user.js的:
module.exports.changePassword = function(username, newPassword, callback) {
var query = {username: username};
User.findOne(query, function (err, userToChange, callback){
if (err) {
throw err;
}
if (userToChange) {
bcrypt.genSalt(10, function(err, salt) {
bcrypt.hash(newPassword, salt, function(err, hash) {
userToChange.password = hash;
userToChange.save(callback);
});
});
}
else{
console.log('NO USER');
return req.flash('error_msg', 'User not found');
}
});
}
如果用户不存在,我试图从我的User.changepassword返回布尔变量,并使用这些布尔值在路由页面上设置条件,但我返回的所有内容都是未定义的。你能帮我吗?
答案 0 :(得分:-1)
你误解了异步操作,你不应该在这里同步写代码。如果您在找不到用户时需要发送错误消息,则必须将该代码放在User.findOne()
的回调中。
在您的User.js中,您应该导出如下内容:
module.exports.changePassword = (req, res)=>{
//...
User.findOne(query, (err, user)=>{
if(err){
res.send(err.message);
}else{
//Do other stuffs as the user is found.
}
});
};
在你的路线/用户中,只需:
User.changePassword(req, res);
这不是很好,但仍然可以解决你的问题,我建议你看看Promise,这对异步操作更方便。