我在这里问: Node.js需要继承吗?
我被告知我可以通过省略变量将变量设置为全局作用域。
这对我没用。
也就是说,下面的代码不会使_在必需的文件上可用。
_ = require('underscore');
我可以用Express.js的app.set设置,并在其他地方可用。
这就应该是这样吗?
我在这里问: Node.js需要继承吗?
我被告知我可以通过省略变量将变量设置为全局作用域。
这对我没用。
也就是说,下面的代码不会使_在必需的文件上可用。
_ = require('underscore');
我可以用Express.js的app.set设置,并在其他地方可用。
这就应该是这样吗?
当前回答
你可以像这样使用global:
global._ = require('underscore')
其他回答
如果你试图全局访问字符串,我建议使用dotenv:
安装:
npm i dotenv
然后在项目的根目录中创建.env文件,并将所有你想要的变量设置为全局变量,例如:
DB_HOST='localhost'
DB_DATABASE='my_database'
DB_USER='my_user'
DB_PASSWORD='my_password'
ADMIN_EMAIL='foo@bar.baz'
CITY='Some city'
# ... etc
你甚至可以在启动服务器时通过命令行设置这些变量,如下所示:
NODE_ENV=dev PORT=5000 npm run start-dev
此外,如果您使用git,您可能希望将.env添加到.gitignore中,以确保您不会意外提交敏感信息。
然后只需在server.js文件(或任何要执行的第一个文件)的开头包含以下内容
require('dotenv').config()
要在代码中的任何地方使用这些变量,只需使用process.env.VARIABLE_NAME。
例如:
app.listen(process.env.PORT, () => {
console.log(`Server is running on port ${process.env.PORT}.`)
})
注意:我知道这并没有直接回答这个问题,因为它是关于全局存储字符串而不是Underscore.js,但我认为为了完整性,我会包括它。
你可以使用全局对象。
var X = ['a', 'b', 'c'];
global.x = X;
console.log(x);
//['a', 'b', 'c']
当项目变大时,使用GLOBAL关键字的其他解决方案对于维护/可读性(+名称空间污染和错误)来说是一场噩梦。这个错误我已经见过很多次了,而且还费了不少周折才改正过来。
使用JavaScript文件,然后使用模块导出。
例子:
文件globals.js
var Globals = {
'domain':'www.MrGlobal.com';
}
module.exports = Globals;
如果你想使用这些,使用require。
var globals = require('globals'); // << globals.js path
globals.domain // << Domain.
使用全局命名空间,如global。Myapi = {}:
global.MYAPI._ = require('underscore')
所有其他的海报都在谈论这种糟糕的模式。因此,暂且不讨论这个问题,全局定义变量(OP的问题)的最佳方法是通过名称空间。
提示:使用命名空间进行开发
我同意使用global/ global名称空间来设置全局内容是一种糟糕的实践,在理论上根本不用它(理论上是有效的词)。但是(是的,操作)我确实用它来设置自定义错误类:
// Some global/configuration file that gets called in initialisation
global.MyError = [Function of MyError];
是的,这在这里是禁忌,但如果你的网站/项目在整个地方使用自定义错误,你基本上需要在任何地方定义它,或者至少在某个地方:
首先定义Error类 在你扔它的脚本里 在你捕捉它的剧本里
在全局命名空间中定义我的自定义错误,使我省去了需要我的客户错误库的麻烦。成像抛出自定义错误,其中自定义错误未定义。