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

时间:2017-10-12 22:22:37

标签: javascript node.js require winston

我知道模块加载假设如何在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模块吗?

2 个答案:

答案 0 :(得分:1)

是的,您应该require ./loglet 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将始终是同一个对象:)