Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.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
Javascript 是否可以跨整个Node Express服务器定义全局变量?_Javascript_Node.js_Express_Module - Fatal编程技术网

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

Javascript 是否可以跨整个Node Express服务器定义全局变量?,javascript,node.js,express,module,Javascript,Node.js,Express,Module,我正在创建一个依赖于从API获取的数据的Node/Express应用程序。问题是,我的应用程序必须经常从API获取数据,并且每次都要执行一些密集计算,因此我希望缓存来自API和密集计算的结果 我已经写了一些非常基本的缓存功能(例如,将值写入文本文件),但我很好奇是否有办法将值保存在某种对象的内存中,以便在整个应用程序中轻松访问(例如,跨多个文件)而不是使用util函数每次从文本文件中读取值 例如,也许我有一个范例如下: import { map } from './utils/mapManage

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

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

例如,也许我有一个范例如下:

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

const getGreenValue = (req, res) => {
   res.send(map.green);
}
当服务器首次初始化时,我获取数据,并创建某种缓存值:

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);
}
设计一个试图实现这种行为的系统的最佳方法是什么


提前感谢,并乐意回答任何澄清问题。

请参阅本文档->

在这种情况下,可以使用
global
对象

console.log(globalString); // Output: "This can be accessed anywhere!"

globalString = "Check me out now";
console.log(globalString); // Output: "Check me out now"

globalString = undefined;
console.log(globalString); // Output: undefined```




您可以使用expressjs app.locals属性

要写入数据:

app.locals.map = map;
要读取数据:

let map = app.locals.map;
文件:


我建议你试试
express
specific
app.locals
res.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
在视图中访问相同的内容。这将持续到该请求的生存期