清除Node.js全局variables属性

我的问题不是关于“内存泄漏”,而是关于node.js(expressjs)应用程序的“内存清除”。

我的应用程序应该在服务期间为内存中的快速查找维护一些对象。 在启动应用程序之后(一两天),everthing似乎很好,直到突然我的Web客户端查找对象,因为它已被清除(未定义)。 我怀疑JavaScript GC(垃圾收集)。 但是,正如您在psedu-code中看到的那样,我将对象分配给node.js“global”variables属性,以防止GC清除它们。 请给我一些线索是什么导致了这个问题。

非常感谢您提供的build议〜

我的node.js环境是node.js 0.6.12,expressjs 2.5.8和VMWare cloudfoundry节点托pipe。

这是我的app.js伪代码:

var express = require("express"); var app = module.exports = express.createServer(); // myMethods holds a set of methods to be used for handling raw data. var myMethods = require("myMethods"); // creates node.js global properties referencing objects to prevent GC from purging them global.myMethods = myMethods(); global.myObjects = {}; // omited the express configurations // creates objects (data1, data2) inside the global.myObjects for the user by id. app.post("/createData/:id", function(req, res) { // creates an empty object for the user. var myObject = global.myObjects[req.prams.id] = {}; // gets json data. var data1 = JSON.parse(req.body.data1); var data2 = JSON.parse(req.body.data2); // buildData1 & buildData2 functions transform data1 & data2 into the usable objects. // these functions return the references to the transformed objects. myObject.data1 = global.myMethods.buildData1(data1); myObject.data2 = global.myMethods.buildData2(data2); res.send("Created new data", 200); res.redirect("/"); }); // returns the data1 of the user. // Problem occurs here : myObject becomes "undefined" after one or two days running the service. app.get("/getData1/:id", function(req, res) { var myObject = global.myObjects[req.params.id]; if (myObject !== undefined) { res.json(myObject.data1); } else { res.send(500); } }); // omited other service callback functions. // VMWare cloudfoundry node.js hosting. app.listen(process.env.VCAP_APP_PORT || 3000); 

任何types的caching系统(无论是自己的还是第三方产品)都应该考虑到这种情况。 您不应该依赖内存caching中始终可用的数据。 有太多东西可能导致内存数据消失(机器重启,进程重启等)。

在你的情况下,你可能需要更新你的代码,看看数据是否在caching中。 如果它不在caching中,则从持久性存储(数据库,文件)中获取caching,然后继续。

完全像海星一样,我想保持我的程序简单,没有数据库 。 就像Haesung,我第一次使用Node.js(和express)的经验就是观察这个奇怪的清除。 尽pipe我很困惑,但我并不认为我需要一个存储解决scheme来pipe理一个有几百行的json文件。 当我看到这个灯泡的时刻,

如果你想要一个模块多次执行代码,那么导出一个函数,然后调用这个函数。

它来自http://nodejs.org/api/modules.html#modules_caching 。 所以我的代码在所需的文件里改变了

 var foo = [{"some":"stuff"}]; export.foo; 

到那个

 export.foo = function (bar) { var foo = [{"some":"stuff"}]; return foo.bar; } 

然后它工作正常:-)

然后我build议使用文件系统,我认为4KB的开销对于你的目标和硬件并不是什么大不了的。 如果你熟悉前端JavaScript,这可能是有帮助的https://github.com/coolaj86/node-localStorage