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

标签 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') ,并且我将获得相同的配置实例。我实际看到的是,当我在 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/

相关文章:

node.js - 使用 babel-register `only` 选项

javascript - 我可以使用 HTML 'download' 属性提示下载文件名吗?

javascript - 如何从 github 导入 React 组件?

node.js - 将 HTML 传递给 phantom 并将其渲染为 PDF

javascript - 在 AMD 模块中将 javascript 事件放在哪里?

javascript - 通用函数中的特定变量名称 - Node.js

javascript - 请提供更多帮助让这个循环正常工作?

javascript - jquery UI sortable检测上下轴

javascript - JS onKeyup Counter - 当他变成负数时如何改变计数器的颜色?

javascript - Visual Studio Code 未在 Javascript 中执行错误检查