我是节点js的新手。我在下面这个问题上搜索了很多堆栈溢出,没有我需要的东西。
我有一个app.js文件,它启动节点服务器和路由器文件。我希望能够存储一次全局值,并在包含我的函数的其他服务器端.js文件之间共享。我也想在我的.jade文件中访问这个变量。 (我用快递BTW)
有没有办法实现这个目标?
感谢。
答案 0 :(得分:4)
Node.js文档在Module Caching
下说明缓存模块在首次加载后进行缓存。这意味着(除其他外)每次要求的呼叫(' foo')都会 获得完全相同的返回对象,如果它将解析为相同 文件。
多次调用require(' foo')可能不会导致模块代码 多次执行。这是一个重要的特征。用它, "部分完成"可以返回对象,从而允许传递 即使它们会导致循环,也要加载依赖项。
如果您想让模块多次执行代码,那么导出 一个函数,并调用该函数。
这意味着只需将全局对象放在自己的模块中即可轻松公开它。
//config.js
var config = {
dbUrl: 'mogodb://localhost:2107/persons'
};
module.exports = config;
然后,当您想要访问该对象时,您只需执行以下操作:
var config = require('./config');
完成后,您可以随处访问同一个实例。
答案 1 :(得分:0)
您希望限制Node中全局变量的使用。这是因为与任何其他服务器端语言不同,Node是一个共享所有请求的持久进程。因此,您无法全局设置用户状态,因为这些状态将在访问您网站的所有用户之间共享。
在原始节点中,有两个全局上下文:
global.foo = 'bar';
// and the process object
process.some_var = 1;
在Express中,您可以设置应用程序范围的变量using app.set
但是,大多数情况下,您希望通过将数据添加到request
或response
对象来共享数据。那是因为那些对象是" user"细节,与全局命名空间不同。
对于模板,您总是希望传递上下文:
app.render('email', Object.assign( aSharedObject, {
specific: 'values'
}));
答案 2 :(得分:0)
我会使用process.env,或者如果你正在使用nconf将它放入应用程序配置中,就像乔丹所说的那样,如果你不想包含nconf或任何其他conf模块或使用进程,全局变量是个坏主意。 .env然后你可以创建一个模块并导出一组getter和setter来处理值