首页 > 解决方案 > Node.js:在多个文件之间共享对象数据

问题描述

我正在创建一个 Electron 应用程序,并希望创建一个在整个应用程序中共享的 Config 类型对象。我最初的想法是使用单例,但这仅在我在创建类的同一文件中创建对象的新实例时才有效。

我想要实现的是拥有一个 Config 对象,其数据require()在不同文件中的多个语句之间共享。我希望下面的示例可以解决问题。换句话说,一旦file1.js开始修改配置对象中的变量,我想file2.js看到这些变化。这两个文件应该能够几乎“共享”对象中的数据。

我能想到的唯一想法是使用全局变量,然后将所有类函数设为静态。所以this.variable = '...';我会使用global.variable = '...';. 这样即使创建了 Config 类的多个对象,它们仍然会共享变量值。这会是更好的选择吗?

本地文件:

-- ../lib/config.js --

class Config {
    constructor(){
        if(!Config.instance){
            console.log('creating instance');
            this.variable = '...';
            Config.instance = this;
        }

        console.log('returning instance');
        return Config.instance;
    }

    getValue() { return this.variable }
   
    setValue(val) { this.variable = val }
}

const configHandler = new Config();
module.exports = configHandler;
--file1.js--

const config = require('../lib/config');
--file2.js--

const config = require('../lib/config');

当前控制台输出

creating instance
returning instance
creating instance
returning instance

预期的控制台输出

creating instance
returning instance
returning instance

标签: javascript

解决方案


我能够通过使用全局变量来实现我想要的。

class Config {
    constructor(){
        this.variable = '...';
    }

    getValue() { return this.variable }
   
    setValue(val) { this.variable = val }
}

if (!global.configHandler) {
    global.configHandler = new Config();
    module.exports = configHandler;
} else {
    module.exports = global.configHandler;
}

基本上,如果配置对象已经存在于全局范围内,我会导出该对象。如果没有,我创建新的配置对象,将其设置为全局变量,然后最后导出该变量。


推荐阅读