是否有某种类似Session的变量来保存Nodejs中的数组? 我的意思是我可以在其他范围内定义名称并在不同范围内访问(即:变量(“Array1”)在函数A中定义但在函数B中访问并持续直到它被销毁)。
原因是我使用Meteor将大文件切成小块,然后将块传回服务器。我尝试使用fs.WriteFile
和fs.AppendFile
的组合,但不知何故该文件在整个过程中被肢解(文件是视频,并且复制的文件发生了播放错误)。
我在某处读到blob可以由构造函数重建。但是,我需要将其传递给全局或类似会话的变量才能这样做。
那么......我如何在Nodejs中使用这样的东西?
答案 0 :(得分:3)
有这样的东西 - 它被称为数据库: - )
当您在Meteor中时,所有文件都会加载到单个运行环境中。因此,与普通节点不同,在一个文件中创建的全局变量可以在任何其他文件中访问。所以你可以写
Slices = {};
在一个文件中,然后在另一个文件中
Slices['Array1'] = ...
请注意,在定义var
对象时没有Slices
关键字,否则它不会是全局的,而是作用于文件。
上述方法显然存在一个问题,它是服务器重新加载的持久性。当服务器崩溃并重新启动时,或者当您上传新版本时,将重新创建所有此类变量并丢失您的数据。
为了防止这种情况,您需要将变量存储在永久保留的位置 - 某种数据库。有几种针对此类运行时变量(例如Redis)的解决方案,但由于您使用Meteor,因此自然解决方案是使用提供的Mongo数据库。所以只需在服务器端创建一个新的集合
Slices = new Meteor.Collection('slices');
并使用通常的find
,insert
,update
和remove
方法来访问您的变量。
答案 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。