如何更新passportjs设置的req.user会话对象?

 小小的梦想123 发布于 2023-02-11 14:54

我试图这么做很多天但我的所有测试都失败了......

我平台上的用户使用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()很重要。没有它,会话将无法保存。

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有