gpt4 book ai didi

javascript - 存活时保留 Node 应用程序的数据

转载 作者:数据小太阳 更新时间:2023-10-29 04:06:02 26 4
gpt4 key购买 nike

我有 Node 应用程序,我需要保留数据(只要 Node 应用程序还活着),它将为用户请求提供服务,(我不想为每个请求计算/解析它,所以我只做一次...... ),当 Node 应用程序关闭时,我不再需要这些数据。

我发现了以下内容(有效)但不确定这是最好的方法缺点是什么。

我用的是这个

require.cache.persist.myData = myData;

我在 express 中使用 Node

最佳答案

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


应用程序级持久化

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

在程序停止之前,您的 Node 程序加载到内存中的任何内容都将保持可访问状态。因此,如果您的程序以行开始

var myData = { ... };

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

module.exports = { ... };

From the docs :

Multiple calls to require('foo') may not cause the module code to be executed multiple times.

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

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

如果您有一个文件,您也可以随意重复使用变量 myData - 它不会去任何地方。 您不需要显式缓存它。如果您有多个文件,您应该按预期使用 require('foo') 函数。


session 级持久化

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

要使用 express 实现此目的,您需要安装 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;
}

全局持久化

当您需要数据可用时甚至在应用程序停止后。当应用程序恢复时,您可以从中断的地方继续。

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

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

您可以使用 fs 内置模块自己轻松完成此操作,或使用预制解决方案,例如 node-persist .在这种情况下,全局持久化非常简单:

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

关于javascript - 存活时保留 Node 应用程序的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31958237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com