7 javascript mongodb node.js passport.js
我使用节点js,passport,express和mongo创建了一个程序,首先你必须注册一个用户,然后你就可以登录了.这是我的用户架构的样子:
var UserSchema = mongoose.Schema({
username: {
type: String,
required: true,
unique: true,
index: true
},
password: {
required: true,
type: String
},
creation_date: {
type: Date,
default: Date.now
},
last_login_date: {
type: Date,
default: Date.now
}
})
Run Code Online (Sandbox Code Playgroud)
如何确定用户上次登录的时间?我一直试图弄清楚这一点,因为我认为这需要在路线中进行?这是我登录的用户路线:
router.post('/login',
passport.authenticate('local'),
function(req, res) {
res.json('Welcome ' + req.user.username);
});
Run Code Online (Sandbox Code Playgroud)
有没有人设法为每个用户添加last_login_date?
任何线索都会有所帮助!
小智 7
如果您已经使用Mongoose,为什么不在您的架构中定义新的静态只是为了登录.
这样就可以将代码保存在一起.
另外..我知道顶层的Mongoose将findOneAndUpdate方法中的更新查询视为$ set操作,所以不需要做这样的事情
query = { $set : { 'last_login_date' : Date.now() } }
Run Code Online (Sandbox Code Playgroud)
..但是...我强烈建议您仍然使用$ set操作来保持清晰,如果您及时切换到另一个驱动程序或插件,您仍然可以保留所有查询.但这只是个人习惯.如果您使用Mongo Shell,如果您忘记在更新时使用$ set,则会收到不良结果.
因此,我建议您在用户架构中定义静态,以设置上次登录日期并返回更新的文档,以便每次用户登录时都可以在护照中使用它.
您的架构如下所示:
var UserSchema = mongoose.Schema({
username: {
type: String,
required: true,
unique: true,
index: true
},
password: {
required: true,
type: String
},
creation_date: {
type: Date,
default: Date.now
},
last_login_date: {
type: Date,
default: Date.now
}
});
UserSchema.statics.login = function login(id, callback) {
return this.findByIdAndUpdate(id, { $set : { 'last_login_date' : Date.now() }, { new : true }, callback);
};
Run Code Online (Sandbox Code Playgroud)
使用此方法,您可以让用户进入会话并立即更新last_login_date.
我还建议你把这个方法放在像Ankit Rana建议的deserializeUser方法中.这样,您的req.user对象包含更新的last_login_date.
在您发布的代码中,您只需更新last_login_date,但不会返回更新的文档.因此,在req.user中,您仍然拥有上一个会话的last_login_date.您可以通过将其打印到控制台来检查.
console.log(req.user.last_login_date); //last_login_date will not be updated
res.json('Welcome ' + req.user.username);
Run Code Online (Sandbox Code Playgroud)
因此,从passport.authenticate方法中删除所有更新方法,如下所示
router.post('/login',
passport.authenticate('local'),
function(req, res) {
// if login is successfull, the following message will be displayed
res.json('Welcome ' + req.user.username);
Run Code Online (Sandbox Code Playgroud)
并将passport.deserializeUser方法更改为此
passport.deserializeUser(function(id, done) {
User.login(id, function(err, user) {
if(err) return done(err, null);
done(err, user);
});
});
Run Code Online (Sandbox Code Playgroud)
尝试一下,如果有什么不起作用或不清楚,请告诉我
这是您可以获取用户并获取上次登录日期的地方,手动添加用户对象。以及您可以通过req.user.last_login_date轻松访问的属性
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
if(err) return done(err, user);
user.last_login_date = Date.now(); // Typo was here.
done(err, user);
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1985 次 |
| 最近记录: |