【问题标题】:Initializing Global Class and Making it Available Throughout Node Application初始化全局类并使其在整个节点应用程序中可用
【发布时间】:2017-03-16 07:12:03
【问题描述】:

所以我在当前项目中有一个位置,我正在初始化一个 APN(Apple 推送通知)连接,但我需要初始化它,因为我不需要多个连接实例。目前我有一个类创建连接并将我们需要的侦听器放在连接上以监视错误等。它看起来像这样:

export default class pushService {
    constructor(options) {
        ... check that options is proper ...

        this.apnConnection = apn.Provider(options);

        ... add listeners ...
    }

    sendMessage(message, recipents) {
        this.apnConnection.send() messages
    }
}

现在可能需要在多个位置使用它,但正如我所说,我希望整个应用程序只有一个 APN 连接的连接实例。

那么,最好在应用程序的主文件中初始化它并使其成为命名导出,还是应该以其他方式启动?如果可以避免,我认为导入整个主应用程序文件不是一个好主意,但这样做可能没有问题?

另外,如果这太主观了,我很抱歉,但我认为我还没有在这里看到过这个问题,也没有在我的 Google 搜索中回答过这个问题,而且它似乎有一个或多个好的解决方案。

【问题讨论】:

  • node.js global variables?的可能重复
  • @tcooc 我不相信,因为我要问的问题是创建一个我举例的类的实例,我必须在构造时输入变量?
  • 只需创建一个类的实例,然后执行global.foo = instance;
  • 我会指出@DaveDopson 对他的回答的回复:“具体而言,对于 GLOBAL,问题在于可读性。如果您的程序混杂使用全局变量,则意味着为了理解代码,我必须了解整个应用程序的动态运行时状态。这就是程序员对全局变量持谨慎态度的原因。我确信有几十种方法可以有效地使用它们,但我们大多只是看到它们被初级程序员滥用到病态产品。”我想这或多或少总结了为什么我试图看看是否有更好的方法是“最佳实践”?但也许就是这样。
  • 使用全局绝对不是最佳实践。您的问题非常主观,涉及软件设计和依赖注入,所以我认为这不是真正可以回答的。一个简单的解决方案是让一个“库”模块导出类,另一个“实例”模块导出类的实例。它可能对你有用。

标签: node.js ecmascript-6 apple-push-notifications es6-class


【解决方案1】:

我找到的最佳答案是基于这里的这篇博文:

ES6 Modules - Single Instance Pattern

最后我的数据库连接是这样的:

let instance = null;

export class dbConnection {
    constructor() {
        if(!instance)
            instance = dbConnectionLibrary();

        return instance;
    }
}

我计划为我的推送通知服务做同样的事情,并可能扩展该 dbConnection 类以将连接添加到连接数组,因为我们有一个新要求,即在启动时需要连接多个不同的数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2017-06-17
    相关资源
    最近更新 更多