1

ユーザーのセッションを追跡するためにconnect-mongoexpress-sessionを使用しています。セッションを設定する次のコードがあります。

app.use(session({
    secret: 'scamp',
    store: new MongoStore({
        mongooseConnection: mongoose.connection,
        ttl: 60 * 30 // half hour
    })
}));

これに関する問題は、サーバーに送信されるすべてのリクエストに対してセッションが作成されることです。たとえば、Amazon Web Services を使用してアプリをホストし、10 秒ごとにサーバーにリクエストを送信して、まだ稼働していることを確認します (ヘルスチェックと呼ばれます)。ヘルス チェック リクエストは、mydomain/health への GET リクエストです。しかし、私が持っているコードを使用すると、リモート Mongo Db のセッション コレクションに保存される新しいセッションが作成されます。そのため、データベースは急速に巨大化します。

背景: 私のアプリでは、ユーザーがファイルをアップロードしてから、各ファイルを操作できます。ユーザーが対話しているCURRENTファイルをセッションで追跡するだけです(私のセッションでは、現在のファイルID、ファイルパス、選択された現在のファイルパラメーターなどを保持します)。したがって、基本的に、すべてではなく、API への特定のリクエストのセッションのみを設定したいと考えています。

だから私は自分のコードを書き直すと思った:

var setsession = function (req, res, next){

    session({
        secret: 'scamp',
        store: new MongoStore({
            mongooseConnection: mongoose.connection,
            ttl: 60 * 30 // half hour
        })
    })

    next();
};

app.use(setsession);

setSession()次に、リクエストエンドポイントが何であるかを確認するためにチェックを行い、リクエストがセッションを必要とするものの1つである場合はセッションを設定することを計画していました。ただし、上記のコードを変更すると、すぐにアプリが壊れます。以下に私が持っています:

app.get('/api/canvas', function(req, res) {

    sess = req.session;

    var callback = function() {

        graphController.constructGraph();
    };

    console.log('req.session is ', req.session);

    var graphController = new GraphController(req, res, sess, callback);
});

今、独自のメソッドからsession()出入りした後、 req.session があり、アプリが壊れます。なぜこれが起こっているのですか?app.useundefined

また、これは、API へのすべてのリクエストでセッションが保存されないようにするための良い方法ですか?

4

1 に答える 1

2

saveUninitializedデータが含まれていない場合、セッションが保存されないようにするオプションがあります。

app.use(session({
    secret: 'scamp',
    store: new MongoStore({
        mongooseConnection: mongoose.connection,
        ttl: 60 * 30 // half hour
    }),
    saveUninitialized: false
}));

「初期化されていない」セッションを強制的にストアに保存します。セッションは、新しいが変更されていない場合、初期化されていません。false を選択すると、ログイン セッションを実装したり、サーバー ストレージの使用量を減らしたり、Cookie を設定する前に許可が必要な法律に準拠したりする場合に役立ちます。false を選択すると、クライアントがセッションなしで複数の並列リクエストを行う競合状態にも役立ちます。

デフォルト値は true ですが、デフォルトは将来変更されるため、デフォルトの使用は推奨されていません。この設定を調べて、ユースケースに適したものを選択してください。

https://www.npmjs.com/package/express-session#saveuninitialized

于 2016-03-13T13:23:03.227 に答える