2013-08-22 3 views
0

node.js 용 Express 및 Passport를 사용하여 간단한 웹 서버를 작성하고 간단한 모듈을 코딩 한 다음 모듈을 GET 요청에로드하면 모든 것이 작동합니다 둘 이상의 사용자가 요청에 액세스 할 때까지 좋습니다.ExpressJS/Node.js에서 메모리 충돌을 피하는 방법

"app.get"함수의 "var"는 함수가 끝난 후에 메모리에서 제거되었지만 그렇지 않은 경우 외부 모듈 내부의 일부 로컬 변수를 사용한다고 생각합니다.

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

을 그리고 익스프레스 요청 코드는 다음과 같습니다 : 사용자간에 공유되는 모듈은 다음과 같습니다

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; 

이 메모리 (누수)을 저장하는 가장 좋은 방법이 있나요?

답변

1

함수가 호출 될 때마다 로컬 범위에서 "깨끗한"지역 변수를 얻습니다. 모듈은 깨끗하고 체계적인 코드를 작성하기위한 것이므로 전역 범위에서 모든 함수와 변수를 가질 필요가 없습니다. 나는 require이 모듈을 캐쉬한다고 믿는다. 그래서 아마도 모듈로부터 익스포트 된 함수를 둘러싼 클로저에서 변수에 문제가있다. 더 많은 코드를 포함해야합니다.

이 문제를 해결할 수있는 한 가지 방법은 모듈을 만드는 함수를 내보내는 것입니다. 이 함수는 생성자가 될 수 있으며 카운터를 로컬에 배치합니다.

다시 한 가지 해결책입니다.

+0

을 req.session.some_value에 명시 세션 미들웨어를 사용하고 변수를 추가해야 고마워, 모듈 캐싱을 잊어 버렸습니다. 올바르게 수행하는 방법에 대한 온라인 가이드/예를 알고 계십니까? –

1

변수 'some_value'는 모듈 컨텍스트에서 전역 변수입니다. 따라서 요청이이 모듈을 사용할 때마다 동일한 변수를 사용합니다.

(모듈 캐시 않습니다 필요 처음에만로드 느릅 나무)

내가 이것을 달성하기 위해 두 가지 방법을 생각할 수

:

  • 중 당신이 요청 당 하나 개의 변수를 원하고,이 선언 모듈 함수의 변수 또는 res.locals에 저장됩니다.같은 요청 동안 많은 기능에 사용하려는 경우 some_value
  • 중 하나는 사용자 당 하나 개의 변수를 원하고, 다음
+0

감사합니다. node.js 모듈을 검토하여 모듈이 어떻게 만들어지고 어떻게 작동하는지 확인하고 작동하는 것으로 보이지만 이상적인 코드인지 여부는 알 수 없습니다. 업데이트를 확인하십시오. –

+2

이 요청에서만 카운터 변수를 유지하려면 새/클래스가 필요하지 않습니다. 간단한'module.exports = function() {var counter = 0; return {a : function() {}, b : function() {}};};'작동합니다. –

+0

맞습니다.하지만 제가 필요한 것은 사실 여러 가지 방법으로 구성된 복잡한 모듈이었습니다. 복잡한 모듈에 대한 좋은 습관이고 메모리를 먹지 않기를 바랍니다. 좋은 방법을 가르쳐주는 온라인 자료를 찾을 수 없기 때문에 메모리를 먹지 않습니다. 고아한 "안녕하세요 세상"예보다 훨씬 진보 된 것을 해줘서 고마워. –

관련 문제