在活动时保留节点应用程序的数据

我有节点应用程序,我需要保持数据(到目前为止节点应用程序是活着的),这将服务用户的请求,(我不想计算/parsing它的每一个请求,所以我做了一次…),当节点应用程序closures了我不需要这个数据了。

我发现以下(这是工作),但不知道这是这样做的最好方法,如果有什么缺点。

这是我使用哪个工作

require.cache.persist.myData = myData; 

我使用快递节点

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


应用程序级别的持久性

只要Node应用程序正在运行,就需要数据保持可用状态。 如果停止或崩溃,则数据丢失。 这是要解决的最简单的问题,我想你在应用程序中寻找的级别。

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

 var myData = { ... }; 

那么myData将保留在内存中,并可以从该文件访问只要应用程序。 您可以使用require("./data.js")从另一个文件加载数据,其中data.js的内容必须导出您的数据:

 module.exports = { ... }; 

从文档 :

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

requirecaching执行data.js的结果,并在每次随后请求时从caching中提供它们。 您的代码只是直接在caching中放置数据,而不执行外部文件。

上面的策略没有任何特别的优势。

如果你有一个文件,那么你可以按照你喜欢的方式重复使用variablesmyData ,它不会去任何地方。 你不需要显式地caching它。 如果你有多个文件,你应该使用require('foo')函数。


会话级别的持久性

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

为了达到这个目的,你需要安装express-session软件包。 这非常容易使用。 像任何其他模块一样包含它,告诉express将它用作中间件,并且你会发现你自己有一个持久性的req.session对象,你可以在其中存储你的数据。

例如:

 var session = require('express-session'); var app = express(); app.use(session({secret: 'ssshhhhh'})); app.get('/',function(req,res){ req.session = myData; } 

全球持久性

当您需要数据即使在应用程序停止后也可用。 当应用程序恢复时,您可以拿起您离开的位置。

这个问题通常是使用外部数据库解决的。 节点将数据传递给其他应用程序(例如MySQL,MongoDB等),并且负责照顾它。 当你再次需要数据时,即使在重新启动之后,你也可以直接询问它们。

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

您可以使用fs内置模块轻松地执行此操作,也可以使用预先制定的解决scheme(如node-persist 。 在这种情况下,全局持久性如下所示:

 var storage = require('node-persist'); storage.initSync(); storage.setItem('myPersistentData', { ... }); console.log(storage.getItem('myPersistentData')); 

我相信你想caching你的应用程序的服务器端的数据。 如果是这种情况,那么可以使用node-cache npm另外,还有一个名为node-persist的npm使用了HTML5 localstorage特性的API。 尝试从这里

你可以使用节点cachingpipe理器和内存存储:

 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) {}); }); });