在node中,如何检测redis会话中剩余的时间?

flseospp  于 2021-06-07  发布在  Redis
关注(0)|答案(1)|浏览(261)

在使用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还是expiry而不是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
};
vs91vp4v

vs91vp4v1#

您应该能够通过使用相应的键(即您定义的键前缀(默认值))调用redisclient来获取条目本身的ttl sess )和会话id。类似的东西应该可以:

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("...");
    }));
})

相关问题