快递 - 保存不被称为

时间:2015-06-05 12:36:07

标签: node.js mongodb express mongoose

他在那里,

我刚开始使用express / mongoose,我对这个概念很新。目前每次用户登录时都尝试更新计数器。我使用的是expres 4.8.8,mongoose,3.8.15,passport 0.2.1

我有以下路线,成功时会调用该功能:

// Set up the 'signin' routes 
app.route('/signin')
   .get(users.renderSignin)
   .post(passport.authenticate('local', {
        failureRedirect: '/',
        failureFlash: true
   }),function(req,res,next){
        users.updateLoginCount(req.user.id);
        res.redirect('/');
    });

然后在用户控制器中,我想更新当前登录用户的登录计数器:

exports.updateLoginCount = function(user_id){
    User.findById(user_id, function(err,user){
        if(!err){
            user.counters.login += 1;
            user.save(function(err){
                console.log('start save');
                if(err) {
                    console.log(err);
                }else{
                    console.log(user.username + ' logged in for the ' + user.counters.login + ' time');
                }
            });
        }else{
            console.log('Error');
        }
    });
};

模型看起来像:

// Define a new 'UserSchema'
var UserSchema = new Schema({
    firstName: String,
    lastName: String,
    email: {
        type: String,
        // Validate the email format
        match: [/.+\@.+\..+/, "Please fill a valid email address"]
    },
    username: {
        type: String,
        // Set a unique 'username' index
        unique: true,
        // Validate 'username' value existance
        required: 'Username is required',
        // Trim the 'username' field
        trim: true
    },
    password: {
        type: String,
        // Validate the 'password' value length
        validate: [

            function(password) {
                return password && password.length > 6;
            }, 'Password should be longer'
        ]
    },
    salt: {
        type: String
    },
    provider: {
        type: String,
        // Validate 'provider' value existance
        required: 'Provider is required'
    },
    providerId: String,
    providerData: {},
    created: {
        type: Date,
        // Create a default 'created' value
        default: Date.now
    },

    counters:{
        login:{
            type:Number,
            default: 0,
        }   
    }

});

但不知怎的,它并没有调用user.save()。它也没有显示任何错误,所以我不知道我在这里做错了什么。它工作正常,直到user.save()部分。

我希望有人可以指出我所犯的错误。如果需要更多信息,请告诉我!

1 个答案:

答案 0 :(得分:0)

由于node.js是异步的,我相信你的res.redirect在登录更新函数完成执行之前执行。因此,您需要为方法设置回调并在更新完成后运行res.redirect。

顺便说一下,您可以使用mongoose update语句增加如下所示的值。当然,如果您需要其他用户信息,请继续使用findById。

    exports.updateLoginCount = function(user_id, callback){
        User.update('_id' : user_id, {$inc: {"counters.login" : 1}}, function(err){
            if(err)
               console.log(err);
            else{
                  console.log(user_id + " login count increased by one" );
                  callback();
            }
        });
    }

调用方法;

...
}),function(req,res,next){
        users.updateLoginCount(req.user.id, function(){
             res.redirect('/');
        });
    });

PS:我现在没有机会测试它,可能包括一些语法错误:)