每个快速会话持续存在的Node.js变量

时间:2019-02-12 13:46:50

标签: node.js express

我有一些对于每个用户来说都是唯一的信息,该信息不会经常更改,因此我使用node-cron设置了一个cronjob以每天更新一次值。

我的问题是:我可以在哪里存储该值?

我尝试了app.locals,但是从我的角度来看,它充当了整个应用程序的全局变量,这意味着所有用户在此变量中都具有相同的值。

我还尝试使用res.locals来工作,但效果很好,但仅用于设置页面的第一页。之后,当我重新加载页面时,该变量是未定义的,因为它只被设置了一次。

我这样做的方式: 我的代码中有一个中间件,用于检查cronjob是否已安排。如果不是,那么它将调度cronjob并运行一次代码以获取值,然后将其设置为res.locals,这就是为什么它在首次加载时起作用的原因。重新加载时,该中间件可以看到该变量之前已经设置过,因此可以直接使用next()函数转到下一个中​​间件或路由。

由于相同的问题,我检查当前是否设置了cronjob的方式也是错误的。现在,我有一个全局变量cronSchedule,它是一个布尔值。问题在于它是应用程序范围变量,因此当第一个用户加载页面时,该变量设置为true,因此其他用户将不会进行cronjob。

我的中间件

app.use( function( req, res, next ) {
  if (!cronScheduled) {
    // schedule tasks to be run on the server   
    cron.schedule('0 0 * * *', function() {
      functionToGetData();
    });
    functionToGetData();
  } else {
    next();
  }
} );

1 个答案:

答案 0 :(得分:0)

我只是设法弄清楚了!

我使用req.session做到了这一点。

这是我更新的中间件:

app.use( function( req, res, next ) {
  if ( req.user !== undefined && !req.session.cronIsScheduled) {
    // schedule tasks to be run on the server   
    cron.schedule('0 0 * * *', function() {
      functionToGetData();
    });

    functionToGetData();
  } else {
    next();
  }
} );

然后我又添加了一段代码,将会话中的该值添加到res.locals

app.use( function( req, res, next ) {
  res.locals = {
    user: req.user !== undefined ? req.user : undefined,
    academic_periods_student: req.session.academic_periods_student
  };
  next();
});

现在,此变量对于每个用户都是唯一的,并且不会在每次页面加载时重置。当用户注销并重新登录时,它也会重置,在我的情况下,这是一个奖励!