我知道模块加载假设如何在node.js中工作,但我没有观察到正确的行为(如果你看一下,它实际上似乎有一点点差异评论this answer)
使用nodejs 8.2.1,我有以下结构:
app
|
+ server.js
+ log
| |
| + index.js
+ db
|
+ index.js
在server.js中,我调用require('./log')
,在/log/index.js中调用require('winston')
并按如下方式配置:
let logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({
name: 'console',
level: logLevel,
handleExceptions: true,
json: false,
colorize: process.env.NODE_ENV === 'dev',
timestamp: true
})
]
});
根据this answer,我应该只能require('winston')
来自任何其他模块,我会得到相同的配置实例。我实际看到的是,当我require('winston')
db/index.js
时,默认winston
实例位于内存中,根本没有配置。我也走过require.cache
;没有其他模块添加到缓存中,所以据我所知,如果缓存正常工作,则应返回相同的已配置实例 。我已经验证log/index.js
中的代码是在db/index.js
中的模块加载之前被调用的。
有什么想法吗?我应该只是require
我所有依赖模块中的./log
模块吗?
答案 0 :(得分:1)
是的,您应该require
./log
个let logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({
name: 'console',
level: logLevel,
handleExceptions: true,
json: false,
colorize: process.env.NODE_ENV === 'dev',
timestamp: true
})
]
});
module.exports = logger
文件,因为您正在创建一个新的Winston实例。您的日志文件应该导出您在其中创建的Winston记录器实例,例如:
const logger = require('./log')
然后在您的其他代码中,您可以:
{{1}}
并获得相同的实例。
答案 1 :(得分:1)
有什么想法吗?我是否应该在所有依赖模块中都需要我的./log模块?
是的,你应该。就像你说的那样,当你需要父模块已经需要的模块时,你正在访问同一个对象。但实际上你使用winston导入一个构造函数(事实上,为了配置它,你定义了一个名为logger的变量,你创建了一个新的winson记录器)。
您应该只从logs / index.js导出记录器(并使用const而不是let)
OutOfMemoryError
你可以做的另一个模块
const logger = new (winston.Logger)({ ... })
module.exports = logger
logger将始终是同一个对象:)