如何无限期保持用户会话的生存状态?

时间:2019-04-03 06:41:20

标签: node.js heroku passport.js express-session

我有Nodejs,ReactJS和React Native应用程序,MERN应用程序使用免费的dynos部署在Heroku上。会话在一段时间后自动超时。我希望永远保持会议状态而不会过期。

在初始化会话时,我没有设置任何expiry timeMaxAge

app.use(session({
  secret: 'thesecret',
  saveUninitialized: false,
  resave: false
}))

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

我希望在我的ReactJS和React Native应用程序中永远保持会话。我该如何在Heroku上做到这一点?

3 个答案:

答案 0 :(得分:0)

您似乎没有配置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),但是有很多个选项。

答案 1 :(得分:0)

我们可以使用connect-mongodb-session将会话存储在数据库中,并且工作正常。

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,
  }))

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

答案 2 :(得分:0)

通过将会话保存在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,
}))