gpt4 book ai didi

javascript - 调用 require 不会返回相同的对象

转载 作者:行者123 更新时间:2023-12-01 02:55:51 27 4
gpt4 key购买 nike

我知道模块加载应该在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.jsrequire('winston') 时,默认的 winston 实例位于内存,无需任何配置。我也逐步完成了 require.cache ;没有其他模块添加到缓存中,因此据我所知,如果缓存正常工作,应该返回相同的配置实例。我已验证 log/index.js 中的代码在加载 db/index.js 中的模块之前被调用。

有什么想法吗?我应该在所有依赖模块中require我的./log模块吗?

最佳答案

Any ideas? Should I just be requireing my ./log module in all my dependent modules?

是的,你应该这样做。就像你说的,当你需要一个父模块已经需要的模块时,你正在访问同一个对象。但实际上,使用 winston,您正在导入一个构造函数(事实上,为了配置它,您定义一个名为 logger 的变量,并创建一个新的 winson 记录器)。

你应该只从logs/index.js导出记录器(并使用const而不是let)

 const logger = new (winston.Logger)({ ... })
module.exports = logger

在另一个模块中你可以这样做

const logger = require('./log/index.js') // './log' is the same

记录器将始终是同一个对象:)

关于javascript - 调用 require 不会返回相同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46719785/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com