在模块中保存对象并从不同的模块访问它

13
我正在使用以下代码解析JSON数据并在我的模块内部保留它,例如当服务器是(像npm server.js)时,我使用函数parse来解析JSON文件。
最后,这些解析的JSON将保存在configObj对象中,并且我希望在用户请求(通过express)中获取此对象在路由器模块或其他模块中。
我该如何实现?
var configObj;
parse = function () {
        return fs.readFileAsync(file, 'utf8')
            .then(function (res) {
                return JSON.parse(res)
            }).then(function (jsonObj) {
                configObj = jsonObj;
                return jsonObj;
            })
....
        })
    };
    module.exports = {
        parse: parse,
        configObj: configObj
    }

parse 函数只被调用一次,我希望在不同的模块中多次访问 configObj


如果我正确理解了你的问题,那么你可以在每个文件中简单地require该模块,Node将仅在第一次执行它,并在此后获取缓存副本。 - Salman
2个回答

6
你可以使用类似于 node-persist 的东西:
var storage = require('node-persist');
storage.setItem('config', configObj);
console.log(storage.getItem('config'));

除了持久化之外,还有其他方法可以做到这一点,因为我已经在我的应用程序文件夹内读取了文件(JSON 文件)。 - 07_05_GuyT
抱歉,但我认为我不能使用它,因为他们没有提供任何像MIT等的许可证。 - 07_05_GuyT
1
你可以在这里留言 https://github.com/simonlast/node-persist/issues 向作者请求以有效的许可证发布它。 - michelem

3
如果您使用express,最好的方法是使用app.set:当您需要parse模块函数时,可以通过以下方式保存结果: app.set("parse.configObj",configObj) 需要时获取它: app.get("parse.configObj") 或者您可以在require后使用require.cache范围: server.js:
var parse = function () {
        return fs.readFileAsync(file, 'utf8')
            .then(function (res) {
                return JSON.parse(res)
            }).then(function (jsonObj) {
                if (typeof require.cache.persist === "undefined") {
                  require.cache.persist = {};
                }
                require.cache.persist.configObj = jsonObj;
                return jsonObj;
            })
    })
};
module.exports = { parse: parse }

app.s

var parse = require('./server.js').parse();

routes/index.js

console.log( require.cache.persist.configObj );

谢谢,1+ 你能否提供有关第二个选项的更多信息,并结合我的帖子进行解释?非常感谢! - 07_05_GuyT
require.cache['full/path/to/module'].persist = { configObj : configObj } 这段代码有些令人困惑,需要知道何时以及如何执行它,并且如何从不同的模块中调用它。 - 07_05_GuyT
谢谢,你的意思是说如果我放置了持久化代码并且多次调用解析对象,它会被“缓存”? - 07_05_GuyT
第一个问题是这个缓存对象的保留时间是多久,第二个问题是使用这个功能是否很常见? - 07_05_GuyT
你对我的问题有什么想法吗? - 07_05_GuyT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接