В node, как мне определить, сколько времени осталось в сеансе redis?

#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’, и у нас есть старт! Спасибо, что спас мой рассудок!