代码之家  ›  专栏  ›  技术社区  ›  BrDaHa

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

  •  0
  • BrDaHa  · 技术社区  · 7 年前

    我知道如何加载模块 想象上的 在节点中工作。但是我没有观察到正确的行为(实际上,如果你查看上的评论,似乎有一点差异) this answer )

    使用nodejs 8.2.1,我有以下结构:

    app
     |
     + server.js
     + log
     |  |
     |  + index.js
     + db
        |
        + index.js
    

    在服务器中。js,我打电话 require('./log') 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 ,我应该可以 要求('winston') 要求('winston') 在里面 db/index.js ,默认值 winston 实例在内存中,根本没有配置。我已经跨过了 require.cache 也据我所知,没有其他模块添加到缓存中,相同的配置实例 应该 如果缓存工作正常,则返回。我已经验证了 log/index.js db/索引。js公司

    有什么想法吗?我应该只是 require ing我的 ./log

    2 回复  |  直到 7 年前
        1
  •  1
  •   radar155    7 年前

    有什么想法吗?我应该只是要求我的/在我的所有从属模块中记录模块?

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

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

    在另一个模块中,你可以做

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

        2
  •  1
  •   Mark    7 年前

    是的,你应该是 require ing您的 ./log 文件,因为您正在创建Winston的新实例。您的日志文件应该导出您在其中创建的Winston logger实例,如下所示:

    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')
    

    得到相同的实例。