Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在node中,如何检测redis会话中剩余的时间?_Node.js_Express_Redis - Fatal编程技术网

Node.js 在node中,如何检测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'

在使用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
};

您应该能够通过使用相应的密钥(即您定义的密钥前缀(默认
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',我们已经起飞了!谢谢你救了我的命!