我有一些对于每个用户来说都是唯一的信息,该信息不会经常更改,因此我使用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();
}
} );
答案 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();
});
现在,此变量对于每个用户都是唯一的,并且不会在每次页面加载时重置。当用户注销并重新登录时,它也会重置,在我的情况下,这是一个奖励!