postgresql - 生产中的 Express session、passport 和 connect-pg-simple 问题
问题描述
这是我第一次在这里发布问题。我希望你们能帮助我解决这个问题。我对 node.js 相当陌生,表达,对于我的缺乏经验,我很抱歉。
我目前在我的 node.js 快速应用程序中的身份验证会话有问题。我使用 Passport.js 来处理我的身份验证,我使用 connect-pg-simple(一个 PostgreSQL 会话存储)存储登录会话。单击登录按钮后,会话存储在我的 PostgreSQL 数据库中,但不知何故快递找不到它。事实上,它在数据库中存储了两次会话,但其中只有一个获得了护照 cookie。
当服务器仍在本地主机上时,此问题不存在。当我在 Heroku 上托管我的服务器时,它会出现。
此外,每当我推送到 heroku repo 时,它都会显示以下警告:
“connect.session() MemoryStore 不是为生产环境设计的,因为它会泄漏内存,并且不会扩展到单个进程。”
我的猜测是我没有将 express session 正确连接到 PostgreSQL express store。下面是我的代码:
这就是我设置 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, res, 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
}
});
我已经被困在这里几天了。如果您需要更多代码,请告诉我!
解决方案
推荐阅读
- asp.net - 当通过 NuGet 包管理器安装时,为什么我不能使用已安装的 NuGet 包的任何功能?
- rust - Rust,rand gen_range 想要 1 个 arg,而不是 2 个?
- regex - REGEX 删除 ( ) 内的前导和尾随空格
- python - 多线性回归模型中的零值
- java - 如何将带有 @SpringBootApplication 的 maven 模块添加到另一个 maven 模块作为测试范围内的依赖项
- firebase - 由于 cloud firestore 和 firebase auth 错误,我的 Flutter 应用程序不再编译
- minecraft-forge - 放置块时使用平铺实体复制块对象
- javascript - 保证最终订单
- reactjs - 根据变量先前值反应 useState 更新
- python - 如何让 Django 管理页面的用户控制哪些 list_display 字段可见?