如何避免ExpressJS / Node.js上的内存冲突

时间:2013-08-22 13:39:58

标签: node.js memory module express conflict

我正在使用Express和Passport for node.js来构建一个简单的Web服务器,我编写了一个简单的模块,然后我将模块加载到GET请求中,一切都运行良好,直到有多个用户访问请求。 / p>

我使用相信函数完成后从内存中删除了“app.get”函数中的“var”,但事实并非如此,我在外部模块中使用了一些局部变量,并且值正在在用户之间共享,模块如下所示:

var some_value=0;
function some_method(){
    some_value++;
    return some_value;
}
exports.some_method = some_method;

Express请求代码如下所示:

app.get('/someurl', function(req, res) {
    var some_extermal_module = require('/some_extermal_module'); // <-----Right way?
    var data = some_extermal_module.some_method();
    res.render('view', {
        title : 'Title',
        data_to_vew: data
    });
});

“app.get”请求中的对象始终保留在内存中,而不管其他用户是否正在访问它?

运行后如何清理“var”对象?

如何避免此内存冲突?

我是否必须对模块进行不同的编码或以不同的方式调用模块?

非常感谢。

更新:我想这是一个合适的解决方案,但我需要审核一些node.js / Express专家批准或更正。

app.js:

var ext_mod = require('./module');

var express = require('express');
var app = express();

app.get('/', function(req, res){
    var ex_mod_instance = new ext_mod({});
    ex_mod_instance.func_a({},function(ret){
        res.send('Hello World: '+ret);
    });
    ex_mod_instance = null; // clean
});

app.listen(8080);
console.log('Listening on port 8080');

module.js:

var node_module = function(config) {
    this.config = config;
    this.counter=0;
};

node_module.prototype = {
    func_a: function(param,done) {
        this.counter++;
        done(this.counter);
    },
    func_b: function(param,done) {
    }
};

module.exports = node_module;

这是节省内存(泄漏)的最佳方法吗?

2 个答案:

答案 0 :(得分:1)

每次调用函数时,都会在本地范围内获得“干净”的局部变量。模块用于编写干净,有组织的代码,因此您没有全局范围内的所有函数和变量。我相信require会缓存模块,所以也许你在从模块导出的函数的闭包中遇到变量问题。您必须包含更多代码。

您可以通过导出创建模块的函数来解决此问题。该函数可能是您的构造函数,它将在本地对您的计数器进行调整。

同样,这是一个解决方案。

答案 1 :(得分:1)

您的变量&#39; some_value&#39;在模块的上下文中是全局的。因此,每次请求使用此模块时,它都使用相同的变量。

(需要缓存仅在第一次加载的模块)

我可以想到两种方法来实现这个目标:

  • 要么每个请求都有一个变量,要么在模块函数中声明这个变量,要么在res.locals.some_value中声明它,如果你想在同一个请求中在很多函数中使用它
  • 要么每个用户需要一个变量,然后需要使用快速会话中间件,并将变量添加到req.session.some_value