是否可以在整个Node Express服务器上定义全局变量?

我正在创建一个Node / Express应用程序,该应用程序依赖于从API提取的数据。问题是我的应用程序必须经常从API获取数据,并且每次都要进行一些密集的计算,因此我想缓存来自API和密集计算的结果。

我已经写出了一些非常基本的缓存功能(即,将值写入文本文件),但是我很好奇是否存在一种方法可以将值保留在某种对象中的内存中,以便在整个应用程序中轻松访问(例如跨多个文件),而不是每次都有一个util函数从文本文件中读取值。

例如,也许我有一个看起来像这样的范例:

服务器第一次初始化时,我获取数据,并创建某种缓存的值:

const data = await api.get('colors');


const map = {
  red: data.red,blue: data.blue,green: data.green,}

在我的一个控制器中,我想访问map并能够使用这些值。所以也许我可以做这样的事情:

import { map } from './utils/mapManager.js'

const getGreenValue = (req,res) => {
   res.send(map.green);
}

设计试图实现这种行为的系统的最佳方法是什么?

预先感谢,很高兴回答任何澄清的问题。

lxyyxl001 回答:是否可以在整个Node Express服务器上定义全局变量?

您可以使用expressjs app.locals属性。

要写入数据:

app.locals.map = map;

要读取数据:

let map = app.locals.map;

文档:

https://expressjs.com/en/api.html#app.locals

,

请参阅此文档-> Global

在这种情况下,您可以使用SELECT DISTINCT A.EMPLOYEEID,A.EMPLOYEENAME,CASE WHEN C.EMPLOYEEID IS NOT NULL THEN 'YES' ELSE 'NO' END AS TakenInPast2Weeks,B.START_OF_WEEK_STARTING_MON_DATE FROM #EMPLOYEE A CROSS JOIN ( SELECT DISTINCT START_OF_WEEK_STARTING_MON_DATE FROM #CALENDAR WHERE DATE BETWEEN DATEADD(WEEK,-6,CONVERT(DATE,GETDATE())) AND CONVERT(DATE,GETDATE()) ) B LEFT JOIN #FEEDBACK C ON A.EMPLOYEEID = C.EMPLOYEEID AND C.DATETAKEN BETWEEN DATEADD(WEEK,-2,START_OF_WEEK_STARTING_MON_DATE) AND DATEADD(DAY,-1,START_OF_WEEK_STARTING_MON_DATE) 对象。

global
,

我建议您尝试使用express特定的app.localsres.locals

假设您有一个初始化为

的应用
const app = express();

const data = await api.get('colors');
const map = {
  red: data.red,blue: data.blue,green: data.green,}

//Assign it to locals
app.locals.map = map;

现在map在应用程序的整个生命周期中都可用,您只需调用变量map就可以在视图中访问它们。

res.locals做同样的事情,但仅在请求的生命周期内可用。假设您要根据请求发送特定的颜色。您可以这样做。

app.use(function(req,res,next){
    if(req.params.id==='admin')
        res.locals.color = req.app.locals.map.red;
    else
        res.locals.color = req.app.locals.map.blue;
     next();
});

使用上述中间件,您将能够拥有一个变量color,该变量可用于所有后续的中间件和最终视图。您可以使用color访问同一视图。这一直持续到该请求的生存期。

本文链接:https://www.f2er.com/3162088.html

大家都在问