javascript - 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
进行任何调用之前调用函数。foo
index.js
现在这似乎工作正常并且我没有收到任何错误,但我想确保我以有效的方式进行操作,而不是使用一些不应该工作但似乎很好的廉价黑客。我也想了解我为什么会遇到这个问题(我想这可能是由于我缺乏理解如何module.exports
或require
实际工作造成的。我认为这可能是由使用不同的模块引起的吗?我在代码中得到一个“警告”说我们正在使用 CommonJS,它可以转换为 ES6。我听说过 Babel,它允许您将代码从一个模块转换为另一个模块(如果我理解正确的话),尽管这个项目在一周内结束,我会希望尽可能避免使用新事物。
谢谢你的帮助!
解决方案
推荐阅读
- azure-ad-b2c-custom-policy - B2C 隐藏社交介绍
- python - 如何使用 Bearertoken 执行 python 请求获取命令?
- html - 导航菜单中的浮动左侧项目在缩放 90% 等后转到底部
- owasp - 无法在 OWASP ZAP zap-full-scan.py docker 中验证基于 _csrf 令牌的 Web 应用程序
- python - 在Python中的字符串中的两个匹配之前和之后添加中文括号
- android - Ionic App - signed the APK with out (missing)keystore
- github - Change the default base branch for a fork’s pull requests
- node.js - Markdown TOC - how do you turn insert anchors into headings?
- google-api - 我可以在没有商家帐户的情况下使用 Google Pay for Passes 吗?
- exception - Troubleshooting “Related Field got invalid lookup: id”