生产中的快速会话,通行证和connect-pg-simple问题

问题描述

这是我第一次在这里发布问题。我希望你们能帮我这个忙。表示,我对node.js还是很陌生,所以请您多加抱歉。

我的node.js Express应用程序中的身份验证会话目前存在问题。我使用Passport.js进行身份验证,并使用connect-pg-simple(PostgreSQL会话存储)存储登录会话。单击登录按钮后,该会话存储在我的PostgreSQL数据库中,但是以某种方式找不到它。实际上,它将会话两次存储在数据库中,但是只有其中一个在其中获得了护照cookie。

当服务器仍在本地主机上时,不存在此问题。当我在Heroku上托管服务器时出现。

此外,每当我推送到heroku存储库时,它都会显示以下警告:

“ connect.session()MemoryStore不是为生产环境设计的,因为它会泄漏内存,并且不会扩展到单个进程。”

我的猜测是我没有将Express会话正确连接到PostgreSQL Express存储。下面是我的代码:

这是我设置PostgreSQL数据库的方式:

const Pool = require("pg").Pool;

const pool = new Pool({
    user: process.env.PGUSER,password: process.env.PGPASSWORD,host: process.env.PGHOST,port: process.env.PGPORT,database: process.env.PGDATABASE
});


module.exports = pool

这是我设置会话的方式:

const poolSession = new (require('connect-pg-simple')(session))({
    pool : pool    
  })

app.set('trust proxy',1);
app.use(session({
    store: poolSession,secret: process.env.SESSION_SECRET,saveUninitialized: true,resave: false,cookie: { 
        secure: true,maxAge: 30 * 24 * 60 * 60 * 1000
    } // 30 days
}));

app.use(passport.initialize());
app.use(passport.session());

这是单击登录按钮时数据库中已存储2个会话的图像 https://i.stack.imgur.com/lzAby.png

这是我的登录路线(点击登录按钮时):

router
    .route("/signin")
    .post((req,res,next) => {
        console.log("Signing in...")
        passport.authenticate('local',function(err,user,info) {
            //code....

            req.logIn(user,function(err) {[enter image description here][1]
                console.log(user);
                if (err) { 
                    console.log(err);
                    res.send(apiResponse(500,err.message,false,null))
                    return next(err); 
                }
                console.log(req.sessionID); //The id of the 1st session store in db
                console.log(req.isAuthenticated()) //True
                res.redirect('/auth');
            });
        })(req,next);
    })

这是成功登录后重定向到的路由:

router.get("/",(req,res) => {
        console.log("/ ",req.isAuthenticated()); //False
        console.log("/ ",req.sessionID); //The Id of the 2nd session store in db 
        if(req.isAuthenticated()){
           //Notify user login success
        } 
    });

我已经在这里停留了几天。请告诉我是否需要更多代码!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)