2014-06-30 29 views
17

Tôi đang sử dụng PassportJS với ExpressJS.Cập nhật chi tiết người dùng đã đăng nhập trong phiên

Tôi cần cập nhật chi tiết người dùng đã đăng nhập. Trong khi tôi cập nhật điều này trong DB, làm thế nào để cập nhật nó trong phiên quá để request.user chứa các chi tiết người dùng cập nhật?

Tức là, sau khi cập nhật cơ sở dữ liệu, làm cách nào để cập nhật thông tin phiên trên người dùng?

Tôi đã thử trực tiếp chỉ định chi tiết đã cập nhật cho request.user nhưng nó không hoạt động. Tôi sau đó đã thử request.session.passport.user - điều này làm việc nhưng có một sự chậm trễ khoảng 5 đến 10 giây trước khi nó được cập nhật trong request.user quá.

Có chức năng nào tôi cần gọi để cập nhật thông tin người dùng được lưu trữ trong phiên không? Hoặc có một số đối tượng khác mà tôi có thể cập nhật khi thay đổi không có độ trễ

Trả lời

26

Tôi cũng đã tìm ra câu trả lời cho điều này. Không bao giờ được đề cập trong bất kỳ tài liệu hoặc hướng dẫn nào!

gì dường như làm việc là, sau khi tiết kiệm sử dụng mới được cập nhật của bạn, làm req.login(user) ...

// "user" is the user with newly updated info 
user.save(function(err) { 
    if (err) return next(err) 
    // What's happening in passport's session? Check a specific field... 
    console.log("Before relogin: "+req.session.passport.user.changedField) 

    req.login(user, function(err) { 
     if (err) return next(err) 

     console.log("After relogin: "+req.session.passport.user.changedField) 
     res.send(200) 
    }) 
}) 

Các đầu mối đã ở đây ... https://github.com/jaredhanson/passport/issues/208

+0

Cảm ơn bạn đã chỉ ra điều này. Đây có vẻ là cách chính xác để cập nhật dữ liệu phiên vì 'đăng nhập' gọi hàm serializer hộ chiếu cập nhật dữ liệu người dùng được lưu trữ trong phiên. Tuy nhiên, vì lý do nào đó, tôi đã gặp phải sự chậm trễ trong việc cập nhật phiên để mã tương đương 'res.send (200)' trong ứng dụng của tôi được đặt bên trong một hàm 'setTimeout' trong 2 giây - điều đó đã giúp. – callmekatootie

+0

Rất lạ. Vì vậy, nếu bạn làm hai giao diện điều khiển như trong ví dụ của tôi, cái thứ hai vẫn hiển thị dữ liệu cũ? Bạn sẽ nghĩ rằng khi req.login gọi lại xảy ra, mọi thay đổi không đồng bộ sẽ được thực hiện. Vâng, nếu một 2 giây chờ đợi sửa chữa nó mỗi lần, bạn tốt. – chichilatte

Các vấn đề liên quan