如何在node.js中使用全局变量?

如何在node.js中使用全局变量?,node.js,Node.js,例如,我想使用自定义记录器: logger = require('basic-logger'), logger.setLevel('info') var customConfig = { showMillis: true, showTimestamp: true } var log = new logger(customConfig) 如何在其他模块中使用此记录器而不是console.log?大多数人建议不要使用全局变量。如果您想在不同的模块中使用相同的记录器类,可以这样做 logger.

例如,我想使用自定义记录器:

logger = require('basic-logger'),
logger.setLevel('info')

var customConfig = {
showMillis: true,
showTimestamp: true
}

var log = new logger(customConfig)

如何在其他模块中使用此记录器而不是console.log?

大多数人建议不要使用全局变量。如果您想在不同的模块中使用相同的记录器类,可以这样做

logger.js

  module.exports = new logger(customConfig);
foobar.js

  var logger = require('./logger');
  logger('barfoo');
如果需要全局变量,可以执行以下操作:

global.logger = new logger(customConfig);
当涉及全局变量时,Node.js与客户端JavaScript不同。仅仅因为您在Node.js脚本的顶部使用了var一词,并不意味着您需要的所有对象(如“基本记录器”)都可以访问该变量


要使某个东西成为全局的,只需在变量名称前加上单词global和一个点。所以,如果我想让company\u id是全局的,我称之为global.company\u id。但是要小心,global.company\u id和company\u id是同一个东西,所以不要将全局变量命名为任何其他脚本中的任何其他变量-任何将在服务器上或同一代码中的任何其他地方运行的其他脚本

我建议每次使用全局检查时,如果变量已经通过简单的检查来定义

if (!global.logger){
  global.logger = require('my_logger');
}

我发现它有更好的性能

您可以使用global或global来定义它,nodejs同时支持这两种功能

例如

global.underscore = require("underscore");


以下可能是避免使用
if
语句的更好方法:

global.logger || (global.logger = require('my_logger'));

如果使用得当,可以在节点中使用全局变量

节点中全局变量的声明:

a = 10;
GLOBAL.a = 10;
global.a = 10;
以上所有命令都使用不同的语法执行相同的操作

在不需要更改全局变量时使用它们

下面是使用全局变量时可能发生的情况的示例:

// app.js
a = 10; // no var or let or const means global

// users.js
app.get("/users", (req, res, next) => {
   res.send(a); // 10;
});

// permissions.js
app.get("/permissions", (req, res, next) => {
   a = 11; // notice that there is no previous declaration of a in the permissions.js, means we looking for the global instance of a.
   res.send(a); // 11;
});
解释:

先运行用户路由,获得10条

然后运行权限路由并接收11

然后再次运行用户路由并接收11个,而不是10个

可以超越全局变量

现在考虑使用express和assignin res对象作为全局对象。。最终会出现异步错误,导致服务器损坏并关闭

何时使用全局变量?

正如我所说,当var不打算改变时。
无论如何,建议您使用配置文件中的
process.env
对象。

如果您的应用程序是用TypeScript编写的,请尝试

(global as any).logger = // ...


然而,我只会在测试环境中使用React Native的
\uuu DEV\uuuu
时才这样做。

请看这篇文章,这是否回答了您的问题?仅供参考使用
global
(小写)而不是
global
(大写)per不要使用全局变量!如果你开始用多个进程运行你的应用程序,你会被搞得一团糟。Hippo,全局变量在某些情况下是可以的,即使有多个进程。例如,如果几个进程都有自己的logger对象实例,那么logger就不会有任何问题。在某些情况下,全局是唯一的工作方式。我通常使用它来存储常量值,比如“global.email=”contact@domain.com“,并在我的整个项目中使用它。如果明天我想在整个项目中更改它,我只需要在app.js中更改它(本例中是节点示例)。我不知道在Node中使用global以外的其他方法来实现这一点。所以请不要直截了当地说“不要使用全局变量”,只要说“明智地使用全局变量”。@Eagle我真的不明白为什么你不能导入定义电子邮件变量的配置文件。我可以,但我的抱怨不是我能不能用配置文件,而是我能不能安全地使用全局变量。我可以。这是不同的,因为每个文件/模块在构建时隐式地包装在一个IIFE中,所以变量实际上是IIFE的本地变量。@wiktus239这是一个检查,因为它不需要再次加载模块-因此性能更好。答案很好,
if
可以用于不必要地重新定义全局变量,但是我想指出,
require
只加载一次。它一次加载所有内容并缓存结果。因此,不需要使用
if
来避免模块解析和加载,但可以避免反复从缓存中重新分配值。
global.logger=global.logger | | require('my_logger')
我认为使用全局变量的这种方法比为其分配对象实例要好。这种使用全局变量的方法可能没有副作用。
// app.js
a = 10; // no var or let or const means global

// users.js
app.get("/users", (req, res, next) => {
   res.send(a); // 10;
});

// permissions.js
app.get("/permissions", (req, res, next) => {
   a = 11; // notice that there is no previous declaration of a in the permissions.js, means we looking for the global instance of a.
   res.send(a); // 11;
});
(global as any).logger = // ...
Object.assign(global, { logger: // ... })