他在那里,
我刚开始使用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()部分。
我希望有人可以指出我所犯的错误。如果需要更多信息,请告诉我!
答案 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:我现在没有机会测试它,可能包括一些语法错误:)