首页 > 解决方案 > Node.js - 试图理解单例

问题描述

我在我的项目中实现单例模式时遇到问题,该项目在 NodeJS 上运行(据我所知是版本 8)。我创建了一个 Logger 类,当我们想将某些内容记录到控制台或数据库时,我想使用它。最初我将其实现为这样的类:

class Logger {
    constructor() {
    }

    log() {
    }

    logToDatabase() {
    }

}

module.exports = new Logger()

而且我能够const logger = require('./Logger')从其他类调用并使用logger.log()函数。然后我做了一些研究,在 StackOverflow 上找到了一篇文章,有人建议像这样实现模块:

module.exports = {

  log: () => {
  },


  logToDatabase: () => {
  }

}

所以我改变了我的代码,一切(几乎)仍然工作正常。当我想logger.log()从另一个.js文件(在它们的module.exports函数内)调用时遇到了这个问题,如下所示:

另一个文件.js

const logger = require('./Logger')
module.exports = {

  foo: () => {
      logger.log()
  }
}

错误logger.log()不是函数。

我设法通过这样做来解决它:

var logger
module.exports = {

init: () => {
    logger = require('./Logger')
},

foo: () => {
    logger.log()
}

}

我确保在对主文件init进行任何调用之前调用函数。fooindex.js

现在这似乎工作正常并且我没有收到任何错误,但我想确保我以有效的方式进行操作,而不是使用一些不应该工作但似乎很好的廉价黑客。我也想了解我为什么会遇到这个问题(我想这可能是由于我缺乏理解如何module.exportsrequire实际工作造成的。我认为这可能是由使用不同的模块引起的吗?我在代码中得到一个“警告”说我们正在使用 CommonJS,它可以转换为 ES6。我听说过 Babel,它允许您将代码从一个模块转换为另一个模块(如果我理解正确的话),尽管这个项目在一周内结束,我会希望尽可能避免使用新事物。

谢谢你的帮助!

标签: javascriptnode.js

解决方案


推荐阅读