120

今日、初めて Node.js アプリケーションを「本番」モードで実行したところ、次の警告が表示されました。

Warning: connection.session() MemoryStore is not
designed for a production environment, as it will leak
memory, and obviously only work within a single process.

実行する必要があるプロセスは 1 つだけですが、代わりに何を使用すればよいですか? 高速アクセスのために、セッションを RAM に常駐させたいと考えています。また、Node アプリをシャットダウンするだけですべてのセッションを破棄できるようにしたいと考えています。

この単純なタスクのためだけに、Redis、MongoDB、または別のデータベースをインストールするのはやり過ぎのようです。また、実際に使用すべきではないのに、なぜ MemoryStore が Node に含まれているのかわかりませんか?

4

9 に答える 9

81

OK、Connect開発者と話をした後、私はより多くの情報を得ました。ここでメモリリークと見なされるものが2つあります。

  1. 最近のバージョンですでに修正されているJSON解析の問題
  2. ユーザーがセッションにアクセスしない場合(つまり、唯一のクリーンアップはオンアクセスである場合)、期限切れのセッションのクリーンアップがないという事実

解決策はかなり単純なようです。少なくともこれが私が計画していることです。setIntervalを使用して、期限切れのセッションを定期的にクリーンアップします。MemoryStoreはリストを取得するためにall()を提供し、get()を使用して強制的に読み取りを行い、それらを期限切れにすることができます。擬似コード:

function sessionCleanup() {
    sessionStore.all(function(err, sessions) {
        for (var i = 0; i < sessions.length; i++) {
            sessionStore.get(sessions[i], function() {} );
        }
    });
}

これで、setInterval()を介して定期的にsessionCleanupを呼び出すだけで、期限切れのセッションの自動ガベージコレクションが可能になります。これ以上のメモリリークはありません。

于 2012-05-25T21:22:54.770 に答える
49

したがって、これに対する受け入れられた答えは[編集:だった]ほとんどハックであり、他の人は私が過剰だと思うデータベースの使用を推奨しているだけです。

私は同じ問題を抱えていて、 Express-session をcookie- session に置き換えただけです。

これを行うには、次をインストールしcookie-sessionます。

npm install cookie-session

次に、で が使用されているapp.js場所を見つけ、express-sessionに置き換えcookie-sessionます。

app.use(require('cookie-session')({
    // Cookie config, take a look at the docs...
}));

他にもいくつか変更する必要があるかもしれません。

于 2016-05-04T08:49:25.020 に答える
31

アプリが再起動すると (プロセスが終了すると)、すべてのセッション データ (そのプロセスのメモリに存在する) が失われるため、MemoryStore は (迅速な) 開発モード専用です。

データベースを使用したくない場合は、代わりに暗号化された Cookie ストレージを使用してください。

http://www.senchalabs.org/connect/cookieSession.html

于 2012-05-25T20:36:19.323 に答える
8

ウェブ上のコンセンサスは、実際にDBを使用することが正しい方法であるということだと思いますが、それをしたくないと確信している場合は、警告を抑制してください-警告は法律ではありません.

しかし、あなたも私もメモリ リークが実際の問題であることに同意するので、redis がやり過ぎだと言うのは正当化するのが難しいです。

また、実際に使用すべきではないのに、なぜMemoryStoreがNodeに含まれているのかわかりません

それは素晴らしい点ですが、ノード自体はごく最近になって本番環境に対応したと言えます。一部の人々は、それがまったくないという考えに同意しないでしょう.

于 2012-05-25T20:06:13.183 に答える