23

いくつかのルートを持つ Express アプリケーションがありますが、セッションをサポートする必要があるのはそのうちの 2 つだけです。ミドルウェア定義 (app.use(express.session({...)) はその後に続くルートにのみ適用されることをどこでも読んだので、このサンプルを作成しました:

var express = require('express');
var app = express();
app.use(express.bodyParser());

app.get('/path1', function (req, res) {
    res.send('text response');
});


app.use(express.cookieParser());
app.use(express.session({
    secret: 'secret',
    cookie: { maxAge: new Date(Date.now() + 2 * 60 * 1000) }
}));


app.get('/path2', function (req, res) {
    res.session.test = { "test": "test" };
    res.send('text response');
});

app.listen(8088);

しかし、これは機能しません: /path2 res.session は未定義です。
セッションミドルウェア定義を上に移動すると、すべてが機能しますが、/path1 を呼び出すときにセッションが作成されていることがわかります (これは避けたいことです)。

単一のアプリケーションが一部のルートでのみセッションを使用できる方法を誰かが説明できますか?

ありがとう!

///// アップデート //////

さらに掘り下げた後、私はそれを理解しました:

使用しないでください:app.use(express.session({ ... }));
代わりに、次を定義します。

var sessionMiddleware = express.session({
    //session configurations
});

function sessionHandler(req, res, next) { sessionMiddleware(req, res, next); }

次に、セッションのサポートが必要な特定のルートにハンドラーを適用します。

app.get('/path_that_need_session', sessionHandler, function (req, res) {                     
 /* Do somthing with req.session */  
});
4

2 に答える 2

31

使用しないでくださいapp.use(express.session({ ... }))

代わりに、セッション ミドルウェアを初期化し、結果の関数への参照を保存してから、必要なルートに直接含めます。

var express = require('express'),
    app = express();

var session = express.session({
    //session configuration
});

app.use(app.router);


// must come after app.use(app.router);
app.get('/your/route/here', session, function(req, res){
    // code for route handler goes here
});

更新に含まれる回答よりも少し単純です (ラッパー関数は必要ありません)。

于 2014-04-05T15:12:42.127 に答える
1

問題は、実際には、使用される前に/path1定義されたのルートです。 express.session

Express でルート ハンドラーを宣言すると、その時点でrouter(すべてのルートを処理する) ミドルウェアがミドルウェア チェーンに挿入されます。つまりapp.use、将来のルートで使用されるミドルウェア ( のハンドラなど/path2) をまだ作成していない場合は、ルートを処理するときにミドルウェアが呼び出されることはありません。

ハンドラー for/path1を afterapp.use(express.session(...))に移動すると、トリックに頼らなくても機能します。

于 2013-04-08T13:23:38.903 に答える