需要唯一版本的模块

时间:2016-02-14 19:57:44

标签: node.js logging

想象一下,我有一个非常简单的日志程序。我将它存储在一个文件中,以便可以重复使用,让我们调用这个文件logger.js(原创,我知道)。所有这个程序都可以记录给它的任何内容,并在初始化期间给它提供另一个字符串。一个非常简单的实现可能如下所示:

var logger = function () {}
var moduleName = ''

logger.prototype.init = function (name) {
  moduleName = name
}

logger.prototype.log = function (msg) {
  console.log(moduleName + ' ' + msg)
}

module.exports = new logger()

现在,我想要在多个文件中使用此日志记录机制,并初始化多个不同的名称。我可能有app.js

var logger = require('./logger.js')
logger.init('App.js')
logger.log('Hello, World From App.js!')

var module = require('./module.js')

logger.log('Hello, World 2 From App.js!')

因此,在记录不同的内容之前,它需要记录器,打印出原始消息,需要module.js(另一个模块)。一个简单的module.js

var logger2 = require('./logger.js')
logger2.init('Module.js')
logger2.log('Hello, World From Module.js!')

当这些运行时,人们希望输出:

App.js Hello, World From App.js!
Module.js Hello, World From Module.js!
App.js Hello, World 2 From App.js!

然而,我得到了(注意最后一行来自app.js,但显示它来自module.js):

App.js Hello, World From App.js!
Module.js Hello, World From Module.js!
Module.js Hello, World 2 From App.js!

我有没有办法让它能让记录器模块独一无二,这样当我用一个值初始化一个副本时,它不会与其他版本的记录器混淆。考虑到我要求它们使用不同的变量,可以预期它们应该是唯一的,并且初始化一个不会影响另一个,但是情况似乎并非如此。

此外,在最佳情况下,从逻辑上讲,应该有一种方法可以将它们全部置于变量名logger之下。它们都应该超出彼此的范围(我希望)。

1 个答案:

答案 0 :(得分:2)

Node.js缓存来自logger.js的代码,您只有一个logger(在行module.exports = new logger()中创建)。

您可以稍微更改代码以获得所需的功能。 在logger.js

module.exports = function(m){ var l = new logger(); l.init(m); return l };

在其他模块中:

var logger = require('./logger.js')('Module.js')
logger.log('Hello, World 2 From App.js!')

这样,每次拨打require('./logger.js')(moduleName)时,您都会有不同的记录器。