调用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.jsrequire('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 永远是同一个对象:)