我试图这么做很多天但我的所有测试都失败了......
我平台上的用户使用passportjs策略(paypal,facebook,google ...)连接它们.
当用户连接时,我在标题的右侧写下他的昵称.标题的html代码是从把手模板生成的,当这个部分由expressjs提供时,我将req.user会话对象发送到模板,以便写入昵称和其他信息......
顺便说一句,这很好用,但是当用户从他的个人资料中更新他的昵称时我遇到了问题,我无法在服务器端更新会话对象,如果用户重新加载页面,则再次出现旧的昵称.
我不希望每次用户加载页面时都要求DB提供用户信息,所以我想保留这个配置:
// -- Passport session setup passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(obj, done) { done(null, obj); });
我的中间件设置本地:
// -- Set accessible datas from the template res.locals = _.extend(res.locals, { user: req.user, query: req.url, title: app.config.title, url: app.config.url });
我失败了:
// Trying to update req.user directly : not persistent req.user.nickname = User.get('nickname'); // Trying to update passport session : exception error req.session.passport.user = User.toJSON(); // Trying to replace full session object : not persistent var session = req.session; session.passport.user = User.toJSON(); req.session = session;
有什么建议吗?
暂时,只有注销然后登录工作...这不是真的有效:)
编辑:
// Application router var Router = require('./helpers/router.js'); // Create Express Server var app = express().http().io(); // -- Init app router var router = new Router(app); // -- Framework Middleware app.use(router.middleware); ######################### /*** * APP ROUTER **/ // Export router module.exports = function(app) { // Set instance var router = this; // Returns routes register & middleware methods return { // -- Register routes register: function() { requirejs(['routes'], function(routes) { _.each(routes, function(name, route) { app.get(route, function(req, res, next) { requirejs(['views/'+name], function(view) { if ( view ) { var _view = new view(_.extend(req.params, {server: {req: req, res: res, next: next}})); _view.render(name, req, res, next); } else { next(); } }, function (err) { console.log('error' + err) }); }); }); }); }, // -- Bind middleware middleware: function(req, res, next) { // Get the current path console.log("Middleware :: "+req.url); // Add user informations res.locals = _.extend(res.locals, { user: req.user, query: req.url, title: app.config.title, url: app.config.url }); // Go next next(); } } }
Will Stern.. 7
这对我有效并且持续存在:
req.session.passport.user.nickname = 'mynewnickname'
您是否正在使用缓存之前可能需要破坏的路由缓存?
(护照序列化是一样的)
passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(obj, done) { done(null, obj); });
Quan Duong.. 5
我遇到了同样的问题,最后我找到了解决方案:
var user = newDataObj; req.login(user, function(error) { if (!error) { console.log('succcessfully updated user'); } }); res.end(); // important to update session
req.login将调用序列化函数并将新会话保存到db。res.end()很重要。没有它,会话将无法保存。