首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nodejs持久变量

Nodejs持久变量
EN

Stack Overflow用户
提问于 2014-08-21 01:12:37
回答 2查看 2.1K关注 0票数 1

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

原因是我使用Meteor将大文件切片成小块并将其传回给服务器。我尝试使用fs.WriteFilefs.AppendFile的组合,但不知怎么的,这个文件一直被肢解(文件是一个视频,复制的文件出现了回放错误)。

我在某个地方读到blob可以由构造函数重建。但是,为了做到这一点,我需要将它传递给全局变量或类似会话的变量。

So...how我可以在Nodejs中使用这样的东西吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-21 06:21:02

如果一切都发生在相同的进程空间中,则可以使用模块作为单例。

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

因此,如果您有这个模块:

代码语言:javascript
复制
module.exports = new Array();

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

您还可以有一个更复杂的单例:

代码语言:javascript
复制
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);
};

在您的不同文件中,您将包括并使用以下模块:

代码语言:javascript
复制
var blocks = require('./blocks');

console.log(blocks.list());

了解有关模块缓存这里的内容。

票数 2
EN

Stack Overflow用户

发布于 2014-08-21 06:28:13

有这样的东西--它叫做数据库:)

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

代码语言:javascript
复制
Slices = {};

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

代码语言:javascript
复制
Slices['Array1'] = ...

注意,在定义var对象时没有Slices关键字,否则它将不是全局的,而是限定为文件的。

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

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

代码语言:javascript
复制
Slices = new Meteor.Collection('slices');

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25416871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档