2017-01-25 3 views
1

NodeJS 응용 프로그램에서 세션 변수를 처리하기 위해 express-session을 사용하고 있습니다. 로그인 권한을 처리하고, 기록 된 사용자 정보 및 기타 사항을 저장하기 위해 세션 변수를 사용합니다.NodeJS : 모든 클라이언트가 공유하는 세션 변수 (익스프레스 세션)

이 세션 변수가 모든 클라이언트에서 공유된다는 것은 모든 클라이언트에 대해 세션 변수 대신 NodeJS 인스턴스 변수로 작동하는 것처럼 보입니다. 내가 PHP에서 작동하기 때문에 세션 변수가 작동하도록하고 싶습니다.

이 응용 프로그램은 Laravel Back-End 응용 프로그램에서 웹 서비스의 모든 데이터를 검색합니다.

초기화 세션 :

var sessionHelper = require('./helpers/session-helper');  
var session = require('express-session'); 
app.use(session({ 
    secret: config.SESSION_SECRET, 
    resave: false, 
    saveUninitialized: true, 
    cookie: {secure: true} 
})); 
sessionHelper.init(session); 
global.SESSION = sessionHelper; 

세션 도우미 모듈 :

var _session = null; 
module.exports = { 
    init: function (session) { 
     _session = session; 
    }, 
    has: function (name) { 
     return ((_session[name]) ? true : false); 
    }, 
    get: function (name) { 
     return _session[name]; 
    }, 
    set: function (name, value) { 
     _session[name] = value; 
    }, 
    clear: function (name) { 
     _session[name] = undefined; 
    } 
}; 

사용하여 세션 변수 :

,536

내 코드입니다개
SESSION.set('hotels', response.hotels); 
SESSION.get('hotels'); 

덕분에,

+0

내가 제안한 것을 시도 했습니까? 아주 간단합니다. 제대로 작동한다면 질문을 마무리하십시오. – SylonZero

답변

1

문제는 당신이 세계적으로이 도우미 개체에 세션의 특정 인스턴스를 캐시했습니다 것입니다. 일반적으로 개체의 수명주기 및 상태를 관리하는 방법에 대해 확신하지 않는 한 좋은 생각이 아닙니다.

익스프레스 세션이 작동하는 방식은 익스프레스 미들웨어가 요청 당 의 별도 인스턴스를 유지한다는 것입니다.. 당신은 요청의 본문에 일반적으로 해당 세션에 접근해야 다음 사용 방법 Express를 구성하여 당신은 여전히 ​​당신이 설정에 도우미를 원하는 느끼는 경우

app.get('/', function(req, res, next) { 
    var sess = req.session; 

    // sess will have values specific to each unique browser session 
    console.log('This session has an id of ', sess.id); 
}); 

, 당신은 모든 요청에 ​​대해 그 사용하도록 할 수 있습니다

// This should be AFTER the app.use statement for express sessions 
app.use(function (req, res, next) { 
    var sessionHelper = require('./helpers/session-helper'); 
    sessionHelper.init(req.session); 
    req.sessionHelper = sessionHelper; 
    next(); 
}) 

지금, 후속 경로 처리기 코드에서, 당신이 req.sessionHelper가 사용할 수 있습니다 찾을 수 있습니다 : - 당신의 app.get 또는 다른 라우터 방법 전에 여기 방법 거친 생각입니다. 이것은 Express가 먼저 모든 요청에 ​​대한 요청 객체에 도우미를 추가하도록 지시했기 때문입니다. 그러면 작동합니다 :

app.get('/', function(req, res, next) { 
    console.log('Session ID: ', req.sessionHelper.get('id')); 
}); 

세션 저장에 대한 책임은 여전히 ​​사용자에게 있습니다. 재시작 사이에 세션 데이터를 유지하려면 익스프레스 세션과 저장소 (예 : connect-redis 또는 connect-mongo)를 결합해야합니다. 전체 목록은 다음과 같습니다. https://github.com/expressjs/session#compatible-session-stores

+0

이것은 문제의 해결 방법입니다. 감사! – user1462904

+0

@ user1462904 위의 해답을 답으로 표시 할 수 있습니까? 다른 사람들이 동일한 해결책을 찾고자 할 때 도움이 될 것입니다. – SylonZero