0

我正在使用 Express 和 Passport for node.js 来构建一个简单的 Web 服务器,我编写了一个简单的模块,然后我在 GET 请求中加载了该模块,一切正常,直到多个用户访问该请求。

我曾经相信“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 专家的审核才能批准或更正。

应用程序.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');

模块.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;

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

4

2 回答 2

1

Your variable 'some_value' is global in the context of the module. So each time a request use this module, it uses the same variable.

(Require does cache the modules wich are loaded only the first time)

I can think of 2 ways to achieve this:

  • either you want one variable per request, and you declare this variable in the module function, or in the res.locals.some_value if you want to use it in many functions during the same request
  • either you want one variable per user, and then you need to use express session middleware, and add the variable to req.session.some_value
于 2013-08-22T14:09:18.447 回答
1

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

解决此问题的一种方法是导出创建模块的函数。该函数可能是您的构造函数,它将在本地限定您的计数器。

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

于 2013-08-22T13:47:48.933 回答