2013-04-08 11 views
17

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

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

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

誰かがどのように単一のアプリケーションがセッションを使用できる方法を説明することができますいくつかのルート

ありがとうございます!より多くの掘削後

///// UPDATE //////

- 私はそれを考え出した:

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

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

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

そして、セッションサポートを必要とする/ sの特定のルート上のハンドラを適用します。

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

答えをより明確にするには、答えとして書いてそれを受け入れてみましょう(これは問題ありません)。これはセッションを特定のルートに隔離するためにはうまく機能しました。ありがとう。 –

答えて

22

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

アップデートに含まれている回答(ラッパー機能は必要ありません)よりやや簡単です。

+0

ありがとう!それがまさに私がやったことです。 – alonkad

0

問題は/path1の実際のルートです。の前に定義されています。express.sessionが使用されています。

Expressでルートハンドラを宣言すると、その時点ですべてのルートを処理するrouterミドルウェアがミドルウェアチェーンに挿入されます。これは、まだapp.useの未来のルートで使用されるミドルウェア(/path2のハンドラのような)がない場合は、いずれのルートを処理する場合でも決して呼び出されないことを意味します。

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

+0

'' app.use(express.session(...)) 'の後に/ path1ルートを移動すると、セッションを使用します(これは避けたいものです)。 – alonkad

+0

私は/ path2だけにセッションを使用したかっただけです(これは初回認証にのみ使用されています)。/path1はより広範囲に使用され、セッションは必要ないので、セッションのオーバーヘッドを節約したい(DBに保存する) – alonkad

+0

十分に公正である。実際には、 'sessionHandler'関数をあなたのケースに入れておかないといけません。なぜなら、' sessionMiddleware'に引数を委譲しているからです。 – robertklep

関連する問題