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

时间:2012-06-11 20:59:18

标签: node.js

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

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

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

var log = new logger(customConfig)

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

7 个答案:

答案 0 :(得分:85)

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

logger.js

  module.exports = new logger(customConfig);

foobar.js

  var logger = require('./logger');
  logger('barfoo');

如果你想要一个全局变量,你可以这样做:

global.logger = new logger(customConfig);

答案 1 :(得分:41)

global.myNumber; //Delclaration of the global variable - undefined
global.myNumber = 5; //Global variable initialized to value 5. 
var myNumberSquared = global.myNumber * global.myNumber; //Using the global variable. 

当涉及到全局变量时,Node.js与客户端JavaScript不同。仅仅因为你使用Node.js脚本顶部的单词var并不意味着你需要的所有对象都可以访问该变量,例如你的'basic-logger'。

要创建全局的东西,只需在变量名称前加上全局和点。因此,如果我希望company_id是全局的,我将其称为global.company_id。但要小心,global.company_id和company_id是相同的,所以不要将全局变量命名为任何其他脚本中的任何其他变量 - 任何其他将在您的服务器上运行的脚本或同一代码中的任何其他位置。

答案 2 :(得分:25)

您可以使用global或GLOBAL定义它,nodejs支持两者。

例如

global.underscore = require("underscore");

GLOBAL.underscore = require("underscore");

答案 3 :(得分:18)

我建议每次使用全局检查时是否已经通过简单检查来定义变量

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

我发现它有更好的性能

答案 4 :(得分:3)

可能是关注最好避免if声明:

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

答案 5 :(得分:0)

在明智使用的情况下,可以在节点中使用全局变量

在节点中声明全局变量:

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对象。

答案 6 :(得分:0)

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

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

Object.assign(global, { logger: // ... })

但是,只有在测试环境中使用React Native的__DEV__时,我才会这样做。