Nếu bạn đã sử dụng Mongoose tại sao không xác định một tĩnh mới trong schema của bạn chỉ với mục đích khai thác gỗ trong.
Bằng cách này bạn giữ mã của bạn với nhau.
Ngoài ra .. Tôi biết Mongoose ở cấp cao nhất xử lý các truy vấn cập nhật trong một phương pháp findOneAndUpdate như một hoạt động $ bộ, vì vậy không cần phải làm một cái gì đó như thế này
query = { $set : { 'last_login_date' : Date.now() } }
..nhưng ... Tôi mạnh mẽ khuyên bạn vẫn nên sử dụng thao tác $ set để giữ mọi thứ rõ ràng và nếu bạn chuyển sang trình điều khiển hoặc plugin khác kịp thời, bạn vẫn có thể giữ tất cả các truy vấn của mình. Nhưng đó chỉ là một người đam mê cá nhân. Nếu bạn sử dụng Mongo Shell bạn sẽ nhận được kết quả không mong muốn nếu bạn quên sử dụng $ set trên bản cập nhật của mình.
Vì vậy, tôi sẽ khuyên bạn nên xác định một tĩnh trong lược đồ tài khoản để thiết lập ngày đăng nhập cuối cùng và trả lại doc được cập nhật để bạn có thể sử dụng nó trong hộ chiếu mọi người dùng đăng nhập.
schema của bạn sẽ trông như thế này:
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);
};
Với phương pháp này, bạn có thể đưa người dùng đó vào phiên và cập nhật last_login_date ngay lập tức.
Tôi cũng khuyên bạn nên đặt phương thức đó trong phương pháp deserializeUser như Ankit Rana đề xuất. Bằng cách này, đối tượng req.user của bạn chứa last_login_date được cập nhật.
Trong mã bạn đã đăng, bạn chỉ cập nhật last_login_date nhưng bạn không trả lại tài liệu được cập nhật. Vì vậy, trong req.user bạn vẫn có last_login_date từ phiên trước đó. Bạn có thể kiểm tra điều này bằng cách in nó vào giao diện điều khiển.
console.log(req.user.last_login_date); //last_login_date will not be updated
res.json('Welcome ' + req.user.username);
Vì vậy, loại bỏ tất cả các phương pháp cập nhật từ phương pháp passport.authenticate như thế này
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);
Và thay đổi phương thức passport.deserializeUser của bạn để này
passport.deserializeUser(function(id, done) {
User.login(id, function(err, user) {
if(err) return done(err, null);
done(err, user);
});
});
Hãy thử nó ra và cho tôi biết điều gì đó không hoạt động hoặc không rõ ràng
Tôi đã thêm cột được gọi là "last_login_time" và "l ast_logout_time "trong ứng dụng của tôi/ –
Ok ... bất kỳ cơ hội nào bạn có thể cung cấp thêm chi tiết? –