我在我的项目中实现单例模式时遇到问题,该模式在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
时遇到问题,如下所示:
another_file.js
const logger = require('./Logger')
module.exports = {
foo: () => {
logger.log()
}
}
错误是logger.log()
不是函数。
我设法通过执行以下操作来解决它:
var logger
module.exports = {
init: () => {
logger = require('./Logger')
},
foo: () => {
logger.log()
}
}
在我对主init
文件中的foo
进行任何调用之前,我确保先调用index.js
函数。
这似乎现在可以正常工作,而且我没有收到任何错误,但是我想确保自己以有效的方式进行操作,而不是通过使用一些廉价的hack来解决问题,但这种方法似乎没什么问题。我还想了解为什么会遇到此问题(我想这可能是由于我不了解module.exports
或require
的实际工作原理而引起的。我是否认为这可能是由于使用了不同的模块导致的?我在代码中有一个“警告”,说我们正在使用CommonJS,并且可以将其转换为ES6。我听说过Babel,它允许您将代码从一个模块转换为另一个模块(如果我理解正确的话),尽管这个项目在一周时间内结束,我想避免使用新事物。
感谢您的帮助!