如何显示找不到用户

时间:2017-10-05 06:04:27

标签: node.js express passport.js

我正在为应用程序创建一个忘记密码功能,我只需更新用户密码(使用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返回布尔变量,并使用这些布尔值在路由页面上设置条件,但我返回的所有内容都是未定义的。你能帮我吗?

1 个答案:

答案 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,这对异步操作更方便。