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 の専門家のレビューが必要です。

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');

モジュール.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

関数が呼び出されるたびに、ローカル スコープで「クリーンな」ローカル変数を取得します。モジュールは、すべての関数と変数がグローバル スコープに含まれないように、クリーンで整理されたコードを記述することを目的としています。モジュールをキャッシュすると信じrequireているので、モジュールからエクスポートされた関数の周りのクロージャーで変数に問題がある可能性があります。さらにコードを含める必要があります。

これを解決する 1 つの方法は、モジュールを作成する関数をエクスポートすることです。その関数は、カウンターをローカルにスコープするコンストラクターである可能性があります。

繰り返しますが、これは 1 つの解決策です。

于 2013-08-22T13:47:48.933 に答える
1

変数 'some_value' は、モジュールのコンテキストでグローバルです。したがって、リクエストがこのモジュールを使用するたびに、同じ変数が使用されます。

(Require は、最初にのみロードされるモジュールをキャッシュします)

これを達成するには、次の 2 つの方法が考えられます。

  • リクエストごとに1つの変数が必要で、この変数をモジュール関数で宣言するか、同じリクエスト中に多くの関数で使用する場合は res.locals.some_value で宣言します
  • ユーザーごとに 1 つの変数が必要な場合は、エクスプレス セッション ミドルウェアを使用し、変数を req.session.some_value に追加する必要があります。
于 2013-08-22T14:09:18.447 に答える