Node.js 在node中,如何检测redis会话中剩余的时间?
在使用express.js的节点中,我设置了一个基于redis的会话:Node.js 在node中,如何检测redis会话中剩余的时间?,node.js,express,redis,Node.js,Express,Redis,在使用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'
// 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
};
您应该能够通过使用相应的密钥(即您定义的密钥前缀(默认
sess
)和session-id)调用您的redisClient来获取条目本身的ttl。类似的操作应该可以:
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("...");
}));
})
你正在使用这个库吗?是的。const redistore=require('connect-redis')(会话);&redis-client->const{getRedisClient}=require('./app/services/redis-client');因此,基于上述内容,我在我的应用程序中添加了以下中间件:``app.use((req,res,next)=>{sessionStore.ttl(
前缀:${req.session.id}
,((err,reply)=>{console.log(“剩余的ttl是“+reply”);next();;;;});``这给了我以下错误:```类型错误:sessionStore.ttl不是一个函数``所以我尝试:`` app.use((req,res,next)=>{console.log(sessionStore.ttl);next();});``虽然有效,但显示sessionStore始终为1200,从不递减。有什么想法吗?您需要在redisClient实例而不是sessionStore上调用ttl。基本上更改代码以保留对redisClient的引用,请参见我的编辑。就在那里!我替换了app.get to a app.use,这样每次我转到新页面时都会调用代码。我将res.send替换为next()。但是,reply的值始终为-2。(对不起,我的话太多了。我怀疑我遗漏了一些显而易见的东西。)我已经将redis设置的代码添加到了我的OP中,以防万一。是的!我把前缀常量从'bl:'改为'bl',我们已经起飞了!谢谢你救了我的命!