最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Nodejs变量,每个快速会话持续存在

运维笔记admin15浏览0评论

Nodejs变量,每个快速会话持续存在

Nodejs变量,每个快速会话持续存在

我有一些每个用户都有的信息,这些信息不会经常更改,因此我使用node-cron设置了一个cronjob,每天更新一次。

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

我尝试了app.locals,但从我看到它作为整个应用程序的全局变量,意味着所有用户在此变量中具有相同的值。

我也尝试使用res.locals,它可以很好地工作,但仅适用于第一页加载,它是设置的地方。之后,当我重新加载页面时,变量是未定义的,因为它只被设置一次。

我这样做的方式:我的代码中有一个中间件,用于检查cronjob是否已经安排好。如果没有,那么它会调度cronjob并运行代码一次以获取值,然后将其设置为res.locals,这就是它在第一次加载时的工作原理。当我重新加载时,这个中间件可以看到变量已经设置好,所以它使用next()函数直接进入下一个中间件或路由。

我检查当前是否设置了cronjob的方式也是错误的,因为同样的问题。现在我有一个全局变量cronSchedule,它是一个布尔值。问题是它是app范围变量,所以当第一个用户加载页面时,变量设置为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();
  }
} );
回答如下:

我只是设法搞清楚了!

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

现在,此变量对每个用户都是唯一的,并且不会在每个页面加载时重置。当用户退出并返回时,它也会重置,在我的情况下是奖励!

发布评论

评论列表(0)

  1. 暂无评论