我正在使用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;
这是节省内存(泄漏)的最佳方法吗?
答案 0 :(得分:1)
每次调用函数时,都会在本地范围内获得“干净”的局部变量。模块用于编写干净,有组织的代码,因此您没有全局范围内的所有函数和变量。我相信require
会缓存模块,所以也许你在从模块导出的函数的闭包中遇到变量问题。您必须包含更多代码。
您可以通过导出创建模块的函数来解决此问题。该函数可能是您的构造函数,它将在本地对您的计数器进行调整。
同样,这是一个解决方案。
答案 1 :(得分:1)
您的变量&#39; some_value&#39;在模块的上下文中是全局的。因此,每次请求使用此模块时,它都使用相同的变量。
(需要缓存仅在第一次加载的模块)
我可以想到两种方法来实现这个目标: