【问题标题】:Calling require does not return the same object调用 require 不会返回相同的对象
【发布时间】:2018-03-24 23:48:31
【问题描述】:

我知道 supposed 模块加载如何在 node.js 中工作,但我没有观察到正确的行为(实际上,如果您查看 cmets 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 中的模块也被加载之前被调用。

有什么想法吗?我是否应该在所有依赖模块中只使用requireing 我的./log 模块?

【问题讨论】:

  • 您不需要配置的记录器吗?

标签: javascript node.js require winston


【解决方案1】:

有什么想法吗?我是否应该在所有依赖模块中都需要我的 ./log 模块?

是的,你应该这样做。就像你说的,当你需要一个父模块已经需要的模块时,你访问的是同一个对象。但实际上使用 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

logger 永远是同一个对象 :)

【讨论】:

    【解决方案2】:

    是的,您应该 requireing 您的 ./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')
    

    并获得相同的实例。

    【讨论】:

    • 节点 8x 中的模块缓存是否发生了变化?
    • 没有模块仍然被缓存。当您创建 new 实例时,您并没有更改默认实例,而是创建了一个新实例。所以你需要导出它。如果您只是导入 Winston,您将获得默认值,而不是您创建和配置的那个。
    猜你喜欢
    • 2016-06-10
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 2014-07-15
    相关资源
    最近更新 更多