Nodejs持久变量

时间:2014-08-21 01:12:38

标签: javascript node.js meteor

是否有某种类似Session的变量来保存Nodejs中的数组? 我的意思是我可以在其他范围内定义名称并在不同范围内访问(即:变量(“Array1”)在函数A中定义但在函数B中访问并持续直到它被销毁)。

原因是我使用Meteor将大文件切成小块,然后将块传回服务器。我尝试使用fs.WriteFilefs.AppendFile的组合,但不知何故该文件在整个过程中被肢解(文件是视频,并且复制的文件发生了播放错误)。

我在某处读到blob可以由构造函数重建。但是,我需要将其传递给全局或类似会话的变量才能这样做。

那么......我如何在Nodejs中使用这样的东西?

2 个答案:

答案 0 :(得分:3)

有这样的东西 - 它被称为数据库: - )


当您在Meteor中时,所有文件都会加载到单个运行环境中。因此,与普通节点不同,在一个文件中创建的全局变量可以在任何其他文件中访问。所以你可以写

Slices = {};

在一个文件中,然后在另一个文件中

Slices['Array1'] = ...

请注意,在定义var对象时没有Slices关键字,否则它不会是全局的,而是作用于文件。


上述方法显然存在一个问题,它是服务器重新加载的持久性。当服务器崩溃并重新启动时,或者当您上传新版本时,将重新创建所有此类变量并丢失您的数据。

为了防止这种情况,您需要将变量存储在永久保留的位置 - 某种数据库。有几种针对此类运行时变量(例如Redis)的解决方案,但由于您使用Meteor,因此自然解决方案是使用提供的Mongo数据库。所以只需在服务器端创建一个新的集合

Slices = new Meteor.Collection('slices');

并使用通常的findinsertupdateremove方法来访问您的变量。

答案 1 :(得分:2)

如果所有事情都发生在同一个进程空间中,则可以将模块用作单例。

请记住,即使多次包含模块,也会返回相同的副本。

所以如果你有这个模块:

module.exports = new Array();

您可以通过其他几个模块包含它,每个模块都有相同的数组实例。

您还可以拥有更复杂的单身人士:

var blocks = {};

module.exports.addBlock = function(name, block) {
    blocks[name] = block;
};

module.exports.getBlock = function(name) {
    return blocks[name];
};

module.exports.delBlock = function(name) {
    delete blocks[name];
};

module.exports.list = function() {
    return Object.keys(blocks);
};

在您的不同文件中,您将包含并使用此模块,如:

var blocks = require('./blocks');

console.log(blocks.list());

了解模块缓存here