Javascript Nodejs持久变量
是否存在某种类似会话的变量来保存Nodejs中的数组? 我的意思是,我可以在其他作用域中定义名称,并在不同的作用域中访问(即:变量(“Array1”)在函数A中定义,但在函数B中访问,并一直保持到它被销毁) 原因是我正在使用Meteor将大文件分割成小块,并将其传回服务器。我尝试使用Javascript Nodejs持久变量,javascript,node.js,meteor,Javascript,Node.js,Meteor,是否存在某种类似会话的变量来保存Nodejs中的数组? 我的意思是,我可以在其他作用域中定义名称,并在不同的作用域中访问(即:变量(“Array1”)在函数A中定义,但在函数B中访问,并一直保持到它被销毁) 原因是我正在使用Meteor将大文件分割成小块,并将其传回服务器。我尝试使用fs.WriteFile和fs.AppendFile的组合,但不知何故,该文件在使用过程中被破坏(该文件是一个视频,复制的文件出现了播放错误) 我在某个地方读到,blob可以由构造函数重建。但是,我需要将其传递给一个
fs.WriteFile
和fs.AppendFile
的组合,但不知何故,该文件在使用过程中被破坏(该文件是一个视频,复制的文件出现了播放错误)
我在某个地方读到,blob可以由构造函数重建。但是,我需要将其传递给一个全局变量或类似会话的变量才能这样做
那么…我怎么能在Nodejs中使用这样的东西呢 如果所有事情都发生在同一个进程空间中,则可以将模块作为单例使用 请记住,即使模块多次包含,也会返回相同的副本 因此,如果您有此模块:
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());
阅读有关模块缓存的内容。如果所有事情都发生在同一进程空间中,则可以将模块作为单例使用 请记住,即使模块多次包含,也会返回相同的副本 因此,如果您有此模块:
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());
阅读有关模块缓存的内容。有这样一种东西——它被称为数据库:-)
在Meteor中,所有文件都加载到单个运行环境中。因此,与普通节点不同,在一个文件中创建的全局变量可以在任何其他文件中访问。这样你就可以写作了
Slices = {};
在一个文件中,然后在另一个文件中
Slices['Array1'] = ...
请注意,在定义切片
对象时,没有var
关键字,否则它将不是全局的,而是作用于文件
显然,上述方法有一个问题,就是服务器重新加载时的持久性。当服务器崩溃并重新启动时,或者当您上载新版本时,所有这些变量都将重新创建,您的数据将丢失 为了防止这种情况,您需要将变量存储在永久保留它们的地方——某种数据库。有几种针对此类运行时变量定制的解决方案(如Redis),但由于您使用的是Meteor,自然的解决方案是使用提供的Mongo数据库。因此,只需在服务器端创建一个新集合
Slices = new Meteor.Collection('slices');
并使用常用的
查找
、插入
、更新
和删除
方法来访问变量。有这样一种方法——它被称为数据库:-)
在Meteor中,所有文件都加载到单个运行环境中。因此,与普通节点不同,在一个文件中创建的全局变量可以在任何其他文件中访问。这样你就可以写作了
Slices = {};
在一个文件中,然后在另一个文件中
Slices['Array1'] = ...
请注意,在定义切片
对象时,没有var
关键字,否则它将不是全局的,而是作用于文件
显然,上述方法有一个问题,就是服务器重新加载时的持久性。当服务器崩溃并重新启动时,或者当您上载新版本时,所有这些变量都将重新创建,您的数据将丢失 为了防止这种情况,您需要将变量存储在永久保留它们的地方——某种数据库。有几种针对此类运行时变量定制的解决方案(如Redis),但由于您使用的是Meteor,自然的解决方案是使用提供的Mongo数据库。因此,只需在服务器端创建一个新集合
Slices = new Meteor.Collection('slices');
并使用常用的
查找
、插入
、更新
和删除
方法访问变量。注意:这是使用plain Node.js时的正确方法,但在Meteor项目中不起作用。注意:这是使用plain Node.js时的正确方法,但是在Meteor项目中不起作用。关于临时/传输文件块的数据库使用的好建议。但我发现,没有斑点使我的生活很困难+1我不知道你所说的“没有斑点”是什么意思。缓冲区和base-64字符串工作得很好,如果你小心的话,字节字符串也可以。事实上,我试图剪切一个大文件(大约1gb),并通过架构将其传输到服务器端。我使用了FileReader()readAsBinaryString(返回为blob),但不知怎的,当我连接它时,文件发生了错误。我注意到nodej作为缓冲区写入,但我传递了blob。这可能是个问题,但是当我检查Nodejs文档时,我没有发现框架中使用的任何blobtype。我能找到的最好的方法是以ArrayByte的形式传输,但对于大数据块(1MB+数据块的浏览器崩溃)效果不佳。现在我改用collectionFS。关于临时/传输文件块的数据库使用,这是一个很好的建议。但我发现,没有斑点使我的生活很困难+1我不知道你所说的“没有斑点”是什么意思。缓冲区和base-64字符串工作得很好,如果你小心的话,字节字符串也可以。事实上,我试图剪切一个大文件(大约1gb),并通过架构将其传输到服务器端。我使用了FileReader()readAsBinaryString(返回为blob),但不知怎的,当我连接它时,文件发生了错误。我注意到nodej作为缓冲区写入,但我传递了blob。这可能是个问题,但是当我检查Nodejs文档时,我没有发现在中使用的blobtype