#node.js #express #redis
#node.js #выражать #редис
Вопрос:
В узле, использующем express.js , У меня есть сеанс на основе redis, настроенный таким образом:
// Redis session
const sessionStore = new RedisStore({
client: getRedisClient(),
prefix: 'bl:',
ttl: parseInt(config.sessionTTL, 10),
logErrors: (err) => {
log.error('Redis session error', {
err_message: err.message,
err_stack: err.stack
});
}
});
app.use(session({
secret: config.sessionSecret,
store: sessionStore,
resave: false,
saveUninitialized: false
}));
Параметр ttl обычно устанавливается на 30 минут, по истечении которых сеанс довольно красиво завершается.
Теперь мне нужно сообщить пользователю, когда до конца сеанса осталось 5 минут или меньше, но я не могу найти способ определить, когда я достиг этого ориентира.
Я предположил (довольно наивно), что оставшееся время будет сохранено в req.session, но когда я показываю, что он обычно показывает только следующее:
Session {
cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true },
cookieChoiceConfirmationBannerSeen: 'seen',
accessPage: '/decision/application-reference',
appRef: '12345678'
}
Как я могу узнать, сколько времени осталось на моем сеансе? Должен ли я использовать maxAge или expiration вместо ttl?
========= РЕДАКТИРОВАТЬ ======== Дополнительная информация: код для getRedisClient:
const redis = require('ioredis');
const config = require('../config/config');
let client;
const getRedisClient = () => {
if (!client) {
client = redis.createClient({
host: config.redisHost,
port: config.redisPort
});
}
return client;
};
module.exports = {
getRedisClient
};
Комментарии:
1. Используете ли вы эту библиотеку github.com/tj/connect-redis ?
2. Да. const RedisStore = require(‘connect-redis’)(сеанс); amp; redis client -> const { getRedisClient } = require(‘./app/services/redis-client’);
Ответ №1:
Вы должны иметь возможность получить ttl самой записи, вызвав свой повторный клиент с соответствующим ключом, т. Е. Вашим определенным префиксом ключа (по умолчанию sess
) и идентификатором сеанса. Что-то вроде этого должно сработать:
const prefix = 'bl:';
const redisClient = getRedisClient();
// Redis session
const sessionStore = new RedisStore({
client: redisClient,
prefix: 'bl:',
ttl: parseInt(config.sessionTTL, 10),
logErrors: (err) => {
log.error('Redis session error', {
err_message: err.message,
err_stack: err.stack
});
}
});
app.get('/get-session-ttl', (req, res) => {
redisClient.ttl(`${prefix}${req.session.id}`,((err, reply) => {
console.log("the remaining ttl is " reply);
res.send("...");
}));
})
Комментарии:
1. Итак, основываясь на вышесказанном, я добавил в свое приложение следующую часть промежуточного программного обеспечения: « app.use((req, res, next) => { sessionStore.ttl(
prefix:${req.session.id}
,((ошибка, ответ) => { console.log(«оставшийся ttl равен » reply); следующий(); })); }); « Это выдало мне следующую ошибку: « TypeError: sessionStore.ttl не является функцией « Поэтому я попробовал: « app.use((req, res, next) => { console.log(sessionStore.ttl); next(); }); « который работал, но показывал sessionStore как всегда 1200 и никогда не уменьшался. Есть какие-нибудь мысли?2. Вам нужно вызвать ttl для экземпляра redisClient, а не для sessionStore. В основном измените свой код, чтобы сохранить ссылку на Повторный клиент, см. Мое редактирование.
3. Почти готово! Я заменил app.get на app.use, чтобы код вызывался каждый раз, когда я перехожу на новую страницу. И я поменял res.send на next() . Однако значение ответа всегда равно -2. (Извините за то, что я толстый. Я подозреваю, что есть что-то совершенно очевидное, чего мне не хватает.)
4. Я добавил код для моей настройки redis в свой OP, на всякий случай, если это актуально.
5. Да! Я изменил константу префикса с ‘bl:’ на ‘bl’, и у нас есть старт! Спасибо, что спас мой рассудок!