Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在节点应用程序处于活动状态时保留数据_Javascript_Node.js_Express_Require - Fatal编程技术网

Javascript 在节点应用程序处于活动状态时保留数据

Javascript 在节点应用程序处于活动状态时保留数据,javascript,node.js,express,require,Javascript,Node.js,Express,Require,我有一个节点应用程序,我需要保存数据(只要节点应用程序还活着),这些数据将服务于用户请求,(我不想为每个请求计算/解析数据,所以我只做一次…), 当节点应用程序关闭时,我不再需要这些数据 我发现以下方法(有效),但不确定这是否是最好的方法 如果有的话,缺点是什么 这就是我所用的,有效的 require.cache.persist.myData = myData; 我将node与express一起使用我相信您希望在应用程序的服务器端缓存数据。如果是这种情况,那么use可以使用 另外,还有一个名为

我有一个节点应用程序,我需要保存数据(只要节点应用程序还活着),这些数据将服务于用户请求,(我不想为每个请求计算/解析数据,所以我只做一次…), 当节点应用程序关闭时,我不再需要这些数据

我发现以下方法(有效),但不确定这是否是最好的方法 如果有的话,缺点是什么

这就是我所用的,有效的

require.cache.persist.myData = myData;

我将node与express一起使用

我相信您希望在应用程序的服务器端缓存数据。如果是这种情况,那么use可以使用
另外,还有一个名为node persist的npm,它使用HTML5本地存储功能的API

有很多方法可以使数据持久化,具体取决于您需要的持久化级别。我将在下面概述几种方法


应用程序级持久性 当您需要数据在节点应用程序运行期间保持可用时。如果它停止或崩溃,数据将丢失。这是最容易解决的问题,我认为这是您在应用程序中寻找的级别

节点程序加载到内存中的任何内容都将保持可访问状态,直到程序停止。所以如果你的程序是从这一行开始的

var myData = { ... };
然后,myData将一直保留在内存中,并且可以从该文件访问,直到应用程序停止为止。您可以使用
require(“./data.js”)
从另一个文件加载数据,其中
data.js
的内容必须导出您的数据:

module.exports = { ... };
:

多次调用require('foo')可能不会导致多次执行模块代码

require
缓存执行
data.js
的结果,并在每次后续请求时从缓存中为其提供服务。您的代码只是将数据直接放在缓存中,而不执行外部文件

与上述策略相比,该策略没有任何特殊优势

如果你有一个文件,你可以随意重复使用变量
myData
——这是行不通的。您不需要显式缓存它。 如果您有多个文件,则应按预期使用
require('foo')
函数


会话级持久性 当您需要数据从一个请求到另一个请求保持可用时,。请注意,这通常比应用程序级持久性弱。如果应用程序在单个用户两次访问之间崩溃并重新启动,则缓存的数据可能会丢失。如果这有问题,请参阅本答案的最后一节

要使用express实现这一点,您需要安装该软件包。它很容易使用。像任何其他模块一样包含它,告诉express将其用作中间件,您将发现自己拥有一个持久的
req.session
对象,您可以将数据存储在其中

例如:

var session = require('express-session');
var app = express();
app.use(session({secret: 'ssshhhhh'}));

app.get('/',function(req,res){
    req.session = myData;
}

全局持久性 用于在应用程序停止后仍需要数据可用的情况。当应用程序恢复时,您可以从中断的地方重新开始

这个问题通常通过使用外部数据库来解决。Node将您的数据传递到其他应用程序(例如MySQL、MongoDB等),并由他们负责管理数据。当您再次需要数据时,即使在重新启动后,您也可以简单地向他们索取数据

然而,在许多情况下,仅仅为了数据的持久性而设置数据库是不必要的。只需将数据写入本地文件就更容易了,即使应用程序崩溃,您也可以信任该文件保持完整。几乎在所有情况下,这都比使用数据库快得多

您可以使用
fs
内置模块轻松地完成这项工作,或者使用预先制作的解决方案,例如。在这种情况下,全局持久性非常简单:

var storage = require('node-persist');
storage.initSync();
storage.setItem('myPersistentData', { ... });
console.log(storage.getItem('myPersistentData'));
您可以与内存存储一起使用:

var cacheManager = require('cache-manager');
var memoryCache = cacheManager.caching({store: 'memory', max: 100, ttl: 10/*seconds*/});
var ttl = 5;
// Note: callback is optional in set() and del().

memoryCache.set('foo', 'bar', {ttl: ttl}, function(err) {
    if (err) { throw err; }

    memoryCache.get('foo', function(err, result) {
        console.log(result);
        // >> 'bar'
        memoryCache.del('foo', function(err) {});
    });
});

听起来您当前的方法会缓存所有会话/用户的数据(每个应用实例存储的数据)。如果此数据与会话相关(每个会话实例存储的数据),则可能需要使用会话数据。如果有帮助的话,我找到了这篇文章。尝试使用节点缓存进行缓存。我会使用一个合适的数据库。为什么不在第一次解析数据后将其保存到一个文件中呢。在文件名中使用本地sessionID,使其与应用程序实例相关。当应用程序关闭时删除它。我使用memcached处理这些内容。最棒的是,缓存可以在我的应用程序实例之间共享,并且它将在应用程序重新启动后继续存在。如果你在服务器的运行期间只需要一些东西,只需将它们存储在一个对象中即可。它非常简单,您不必使用任何类型的包。只需使用一个文件,导出一个对象,然后开始在其中放入内容:)回答得好,+1用于编写它。不过我不建议节点持久化——最好是像Mongo或Redis这样的真实存储系统。但第一部分,用内存变量是好的。我建议作者使用它:)谢谢!事实上,我对这两种系统都没有太多经验。他们的优势是什么?我无法想象,与仅向文件系统写入相比,它们提供了速度优势……哦,尤其是Redis提供了更多的功能!:)它是内存和文件存储的一种混合体——它不能保存用来驱动的信息,而是尽可能多地保存在内存中。因此,它是难以置信的快速和可靠。而且它还具有很强的可扩展性——您可以运行多个实例,并在它们之间轻松共享信息。在系统上保存文件以后会有很大的麻烦。当然,我说的是更大的项目,而不是将几个变量保存到一个对象:)@Hephistocles-谢谢你的回答1+!目前有两个问题:)1.只是为了验证我使用的require.cache.persist.myData不是一个好的实践吗?2.假设我使用您的第一个选项,我可以想象一个带有getter和setter的模块,这就是您的看法