我有Nodejs,ReactJS和React Native应用程序,使用免费dynos在Heroku上部署MERN应用程序。一段时间后会话自动超时。我希望永远保持会话而不会过期。
我在初始化会话时没有设置任何expiry time
或MaxAge
:
app.use(session({
secret: 'thesecret',
saveUninitialized: false,
resave: false
}))
app.use(passport.initialize());
app.use(passport.session());
我期望在我的ReactJS和React Native应用程序中永远保持会话。我怎么能在Heroku上做到这一点?
看起来你没有配置你的store
,这意味着you're using the default MemoryStore
:
警告默认的服务器端会话存储
MemoryStore
不是专为生产环境设计的。它会在大多数情况下泄漏内存,不会扩展到单个进程,并且用于调试和开发。有关商店列表,请参阅compatible session stores。
Heroku dynos restart frequently,每天至少一次,以维持应用程序和基础设施的健康,即使没有先前的警告,内存存储也是不切实际的。
你将不得不选择一个新的session store并进行配置。 Heroku的文件系统is ephemeral,所以请避免将其数据存储在本地磁盘上的任何内容。选择使用data store listed among Heroku's addons的一个可能是有意义的。其中一个PostgreSQL后端可能是一个不错的选择(你可能已经有了Heroku Postgres database),但有很多选择。
通过在mongodb数据库中保存会话,我们可以在nodeJS应用程序中维护一个连续的会话。
var MongoDBStore = require('connect-mongodb-session')(session);
var store = new MongoDBStore({
uri: process.env.MONGODB_URI,
collection: 'mySessions'
});
// Catch errors
store.on('error', function(error) {
console.log(error);
});
app.use(session({
secret: 'thesecret',
saveUninitialized: false,
resave: false,
cookie: {expires: new Date(1586323351000),maxAge:31536000000},
store: store,
}))