94

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

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

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

var log = new logger(customConfig)

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

4

7 回答 7

129

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

logger.js

  module.exports = new logger(customConfig);

foob​​ar.js

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

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

global.logger = new logger(customConfig);
于 2012-06-11T21:07:48.340 回答
56
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' 。

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

于 2013-06-21T05:38:41.020 回答
32

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

例如

global.underscore = require("underscore");

或者

GLOBAL.underscore = require("underscore");
于 2015-08-03T06:26:59.950 回答
25

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

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

我发现它有更好的性能

于 2015-07-14T15:42:58.027 回答
12

如果使用得当,全局变量可以在 Node 中使用。

Node中全局变量的声明:

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配置文件中的对象。

于 2018-12-30T08:09:44.327 回答
6

可能以下是更好地避免if声明:

global.logger || (global.logger = require('my_logger'));
于 2017-07-22T11:46:09.197 回答
6

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

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

或者

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

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

于 2019-07-09T12:09:56.933 回答