想象一下,我有一个非常简单的日志程序。我将它存储在一个文件中,以便可以重复使用,让我们调用这个文件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
之下。它们都应该超出彼此的范围(我希望)。
答案 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)
时,您都会有不同的记录器。