#node.js #heroku #passport.js #express-session
#node.js #heroku #passport.js #экспресс-сессия
Вопрос:
У меня есть Nodejs, ReactJS и React Native app, приложение MERN развернуто на Heroku с использованием бесплатных динамиков. Сеанс автоматически завершается через некоторое время. Я хочу поддерживать сеанс вечно без истечения срока действия.
Я не установил ни expiry time
, ни MaxAge
во время инициализации сеанса:
app.use(session({
secret: 'thesecret',
saveUninitialized: false,
resave: false
}))
app.use(passport.initialize());
app.use(passport.session());
Я рассчитываю поддерживать сеанс вечно в моем ReactJS и React Native приложении. Как я могу сделать это на Heroku?
Ответ №1:
Не похоже, что вы настроили свой store
, что означает, что вы используете значение по умолчанию MemoryStore
:
Предупреждение Хранилище сеансов на стороне сервера по умолчанию,
MemoryStore
намеренно не предназначено для производственной среды. В большинстве случаев происходит утечка памяти, она не масштабируется за пределы одного процесса и предназначена для отладки и разработки.Список хранилищ см. в разделе Совместимые хранилища сеансов.
Для поддержания работоспособности приложений и инфраструктуры часто перезагружайтесь Heroku dynos, по крайней мере, один раз в день, что делает хранилища в памяти непрактичными даже без предварительного предупреждения.
Вам нужно будет выбрать новое хранилище сеансов и настроить его. Файловая система Heroku эфемерна, поэтому, пожалуйста, избегайте всего, что хранит свои данные на локальном диске. Вероятно, имеет смысл выбрать тот, который использует хранилище данных, указанное среди дополнений Heroku. Хорошим выбором может быть один из серверных интерфейсов PostgreSQL (у вас, вероятно, уже есть база данных Heroku Postgres), но есть много вариантов.
Ответ №2:
Сохраняя сеанс в базе данных 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,
}))