2016-10-14 2 views
6

js, passport, express 및 mongo를 사용하여 프로그램을 만들었습니다. 먼저 사용자를 등록해야 로그인 할 수 있습니다. 내 사용자 스키마는 다음과 같습니다.passport/node js에서 last_login_date를 찾는 방법

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 
    } 
}) 

사용자가 마지막으로 로그인 한 시간을 어떻게 알 수 있습니까? 나는 이것이 길에서 일어날 필요가 있다고 가정하면서 잠시 동안 이것을 알아 내려고 노력했다. 내 사용자 로그인 경로 :

router.post('/login', 
passport.authenticate('local'), 
    function(req, res) { 
    res.json('Welcome ' + req.user.username); 
}); 

각 사용자마다 last_login_date를 추가 할 수있는 사람이 있습니까?

실마리가 도움이 될 것입니다.

+0

"last_login_time"및 "l ast_logout_time "내 응용 프로그램/ –

+0

Ok ... 더 자세한 정보를 제공 할 수 있습니까? –

답변

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); 
    }); 
}); 
+1

Im이 걱정 되네.이 줄에는 'TypeError : Date.Now가 함수가 아닙니다.'라는 오류가 있습니다. 'user.last_login_date = Date.Now();' –

+0

나는 대답을 편집했다. – Bwaxxlo

2

확인에 액세스 할 수 있습니다, 그래서 나는 다음을 수행하여이를 관리해야 :

사용자가 로그인, 당신은 사용자를 찾아 last_login_time을 업데이트합니다. 이와 같이 :

router.post('/login', 
    passport.authenticate('local'), 
    function(req, res) { 
     var query = { 
      'username': req.user.username 
     }; 
     var update = { 
      last_login_date: Date.now() 
     }; 
     var options = { 
      new: true 
     }; 
     User.findOneAndUpdate(query, update, options, function(err, user) { 
      if (err) { 
       console.log(err); 
      } 
     }); 
     // if login is successfull, the following message will be displayed 
     res.json('Welcome ' + req.user.username); 

완벽하게 작동하며 사용자가 로그인 할 때마다 last_login_date가 업데이트됩니다.

6

당신이 이미 단지.

이 방법으로 로깅의 목적을 위해 스키마에서 새로운 정적을 정의하지 왜 몽구스를 사용하여 당신이 함께 코드를 유지하는 경우. 최상위 레벨은 $ 집합 연산으로 findOneAndUpdate 방법으로 업데이트 쿼리를 처리에서

또한 .. 내가 강하게 ... 그래서 필요이

query = { $set : { 'last_login_date' : Date.now() } } 

..하지만 그런 짓을하지 않으려면, 몽구스을 알고 확실하게 $ 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); 
}; 

이 방법을 사용하면 세션에서 사용자를 얻고 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); 

그래서 그것을 밖으로 시도하고 저를하자이

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); 

처럼 passport.authenticate 방법의 모든 업데이트 방법을 제거하고이

passport.deserializeUser(function(id, done) { 
    User.login(id, function(err, user) { 
    if(err) return done(err, null); 
    done(err, user); 
    }); 
}); 

에 passport.deserializeUser 방법을 변경 무언가가 작동하지 않거나 명확하지 않은지 확인하십시오.

관련 문제