调用require不return同一个对象
Calling require does not return the same object
我知道应该如何在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')
获取相同的配置实例。我实际看到的是,当我在 db/index.js
中 require('winston')
时,一个默认的 winston
实例在内存中,根本没有配置。我也逐步完成了 require.cache
;没有其他模块被添加到缓存中,据我所知,如果缓存正常工作,相同配置的实例 应该 被返回。我已经验证 log/index.js
中的代码在 db/index.js
中的模块被加载之前被调用。
有什么想法吗?我应该 require
在我的所有依赖模块中使用我的 ./log
模块吗?
是的,您应该 require
编辑您的 ./log
文件,因为您正在创建一个新的 Winston 实例。您的日志文件应导出您在其中创建的 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
})
]
});
module.exports = logger
然后在你的其他代码中你可以:
const logger = require('./log')
并获得相同的实例。
Any ideas? Should I just be requireing my ./log module in all my dependent modules?
是的,你应该。就像你说的,当你需要一个父模块已经需要的模块时,你正在访问同一个对象。但实际上,对于 winston,您正在导入一个构造函数(实际上,要配置它,您定义了一个名为 logger 的变量,并创建了一个新的 winson logger)。
您应该只从 logs/index.js 导出记录器(并使用 const 而不是 let)
const logger = new (winston.Logger)({ ... })
module.exports = logger
在另一个模块中你可以做
const logger = require('./log/index.js') // './log' is the same
logger 永远是同一个对象:)
我知道应该如何在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')
获取相同的配置实例。我实际看到的是,当我在 db/index.js
中 require('winston')
时,一个默认的 winston
实例在内存中,根本没有配置。我也逐步完成了 require.cache
;没有其他模块被添加到缓存中,据我所知,如果缓存正常工作,相同配置的实例 应该 被返回。我已经验证 log/index.js
中的代码在 db/index.js
中的模块被加载之前被调用。
有什么想法吗?我应该 require
在我的所有依赖模块中使用我的 ./log
模块吗?
是的,您应该 require
编辑您的 ./log
文件,因为您正在创建一个新的 Winston 实例。您的日志文件应导出您在其中创建的 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
})
]
});
module.exports = logger
然后在你的其他代码中你可以:
const logger = require('./log')
并获得相同的实例。
Any ideas? Should I just be requireing my ./log module in all my dependent modules?
是的,你应该。就像你说的,当你需要一个父模块已经需要的模块时,你正在访问同一个对象。但实际上,对于 winston,您正在导入一个构造函数(实际上,要配置它,您定义了一个名为 logger 的变量,并创建了一个新的 winson logger)。
您应该只从 logs/index.js 导出记录器(并使用 const 而不是 let)
const logger = new (winston.Logger)({ ... })
module.exports = logger
在另一个模块中你可以做
const logger = require('./log/index.js') // './log' is the same
logger 永远是同一个对象:)