如何找到passport/node js中的last_login_date

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)

尝试一下,如果有什么不起作用或不清楚,请告诉我


Ank*_*ana 0

这是您可以获取用户并获取上次登录日期的地方,手动添加用户对象。以及您可以通过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)