2013-04-08 4 views
17

몇 가지 경로가 포함 된 Express 응용 프로그램이 있으며 두 개만 세션을 지원해야합니다. 나는 미들웨어 정의 (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); 

을하지만이되지 않습니다 일 :에/경로 2 res.session은 정의되지 않습니다
내가 세션 미들웨어 정의를 이동하는 경우 - 모든 작품,하지만 난 세션이 호출 할 때 생성되고있다/경로 1은

(이것이 내가 피하고 싶은 것입니다) 것을 알 수있다. 누군가가 어떻게 단일 응용 프로그램에만 세션을 사용할 수 있습니다 설명 할 수있는.

감사합니다.

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

더 파고 후 - 나는 그것을 알아 냈 :

는 사용하지 마십시오 : - :

app.use(express.session({ ... }));
대신 다음을 정의

app.get('/path_that_need_session', sessionHandler, function (req, res) {      
/* Do somthing with req.session */ 
}); 
:
var sessionMiddleware = express.session({ 
    //session configurations 
}); 

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

그런 다음 세션 지원을 필요로하는 특정 경로/S에 핸들러를 적용

+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

/path1 경로를'app.use (express.session (...)) '다음으로 이동하면 세션을 사용하게됩니다 (피하려고했던 것입니다). – alonkad

+0

/path2 만 세션을 사용하기를 원합니다 (처음 인증에만 사용됨)./path1은 더 광범위하게 사용되며 세션이 필요하지 않습니다. 그래서 세션 오버 헤드를 저장하려고합니다 (DB에 저장합니다). – alonkad

+0

충분히 정교합니다.저는 여러분이'sessionHandler' 함수를 여러분의 케이스에 남겨 둘 수 있다고 생각합니다. 왜냐하면 모든 것은'sessionMiddleware'에 인수를 위임하기 때문입니다. (그래서 직접 사용할 수도 있습니다.) – robertklep