2016-10-14 15 views
6

Tôi đã tạo một chương trình bằng cách sử dụng nút js, hộ chiếu, express và mongo, trước tiên bạn phải đăng ký người dùng và sau đó bạn có thể đăng nhập. Đây là giao diện người dùng của tôi trông như thế nào:Cách tìm hiểu last_login_date trong hộ chiếu/nút js

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

Làm cách nào để biết thời điểm người dùng đăng nhập lần cuối? Tôi đã cố gắng để tìm ra điều này trong một thời gian như tôi giả định điều này sẽ cần phải diễn ra trong các tuyến đường? Đây là tuyến đường người dùng của tôi để đăng nhập:

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

Có ai quản lý để thêm last_login_date cho mỗi người dùng không?

Mọi manh mối sẽ hữu ích!

+0

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/ –

+0

Ok ... bất kỳ cơ hội nào bạn có thể cung cấp thêm chi tiết? –

Trả lời

0

Đây là nơi bạn có thể lấy người dùng và nhận ngày đăng nhập cuối cùng, thêm thủ công đối tượng người dùng. và tài sản mà bạn có thể dễ dàng truy cập bằng cách 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 sợ điều này cho tôi một lỗi: 'TypeError: Date.Now không phải là một chức năng' trên dòng này: 'user.last_login_date = Date.Now();' –

+0

Tôi đã chỉnh sửa câu trả lời – Bwaxxlo

2

Ok, vì vậy tôi đã cố gắng để đạt được điều này bằng cách làm như sau:

Khi người dùng đăng nhập, bạn nhìn cho người sử dụng và sau đó bạn cập nhật last_login_time. Như thế này:

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

Điều này làm việc hoàn hảo và mỗi khi người dùng đăng nhập last_login_date được cập nhật.

6

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