2011-05-04 14 views
10

세션 변수 I 세트가 인 경우 다음 페이지 요청에서 정의되지 않은 세션에 문제가 있습니다. 변수를 적절히 설정하려면 일반적으로 다시 흐름을 거쳐야합니다.Node.js 및 익스프레스 세션 문제

나는 세션 변수를 undefined로 설정하려고하지 않는다는 것을 확인할 수 있습니다. 그들은 합법적 인 가치가 있습니다.

내 앱에서 사용자는/twitter/connect/to/twitter/callback /으로 이동합니다. 전자는 트위터로부터 일부 oauth 데이터를 수집하고, 후자는 사용자를 트위터에 기록합니다.

/트위터/연결/간단하다 : 그 후

app.get('/twitter/connect/?', function(req, res){ 
    consumer().getOAuthRequestToken(function(error, oauthToken, oauthTokenSecret, results){ 
     if (error){ 
      // error handling here 
     } else { 
      req.session.oauthRequestToken = oauthToken; 
      req.session.oauthRequestTokenSecret = oauthTokenSecret; 

      // if I console.log the two session variables above 
      // they have the proper values. 

      res.redirect("https://twitter.com/oauth/authorize?oauth_token="+req.session.oauthRequestToken);  
     } 
    }); 
}); 

, 트위터/트위터/콜백에 다시 보냅니다/: 나는 무슨 일이야 아무 생각이

app.get('/twitter/callback/?', function(req, res){ 
    console.log(req.session.oauthRequestToken); 
    console.log(req.session.oauthRequestTokenSecret); 

    // more often than not, the two variables above are 
    // undefined. but not always. usually on the first 
    // pass, never on the second. 
}); 

, 내가 할 수있는 세션 변수가 제대로 설정되었는지 확인하고, 페이지 요청 사이에 값을 보유하지 않고 처음 만 유지합니다. 난 그냥 지금 dev에 환경이

app.configure('development', function(){ 
    app.use(express.cookieParser()); 
    app.use(express.session({ secret:'yodawgyo' })); 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
    app.use(express.logger()); 
    app.use(express.static(__dirname + '/public')); 
    app.set('view engine', 'ejs'); 
    app.set('view options', { 
     open: '{{', 
     close: '}}' 
    }); 
}); 

: 내 서버를 만드는거야 방법

이입니다. Node 0.5.0-pre가 설치되어 있지만이 문제는 0.4.1에서도 확인되었습니다. 나는 익스프레스 2.3.2를 사용하고있다.

도움을 주시면 감사하겠습니다.

+2

API를 호출하는 것과 똑같은 문제가 있습니다. 리다이렉션시 세션 정보가 손실되었다고 확신합니다. 즉, 브라우저에서 페이지를 새로 고치면 세션에 넣은 내용이 아직 남아 있음을 알 수 있습니다. 그러나 일부 외부 사이트 (예 : oauth 제공 업체)에서 리디렉션을 통해 * 같은 페이지 *로 이동하면 세션이 완전히 비어 있습니다. 문제가 무엇인지 잘 모릅니다. –

+0

업데이트 : 리디렉션 된 요청에 대해 다른 세션 ID를받는 것처럼 보입니다. –

답변

17

Connect 세션에서 어떤 핸들러도 req.session.anything을 임의의 값으로 설정할 수 있으며 핸들러가 end()을 호출 할 때 Connect가 값을 저장합니다. 동시에 여러 요청이있는 경우 위험합니다. 세션이 끝나면 한 세션 값이 다른 세션 값과 충돌합니다. 이것은 원자 적으로 get-and-set 세션 속성을 지원하지 않는 간단한 session API (또는 session source 참조)의 결과입니다.

해결 방법은 세션 미들웨어에 필요한만큼의 요청을 줄이는 것입니다. 다음은 몇 가지 팁입니다.

  1. express.static 처리기를 세션 미들웨어 위에 놓습니다.
  2. 세션이 필요없는 일부 처리기 위로 이동할 수없는 경우 express.session.ignore.push('/individual/path')을 사용하여 req.session을 사용하지 않는 경로를 무시하도록 세션 미들웨어를 구성 할 수도 있습니다.
  3. 처리기가 세션에 쓰지 않는 경우 (세션에서만 읽는 것일 수도 있음) res.end();을 호출하기 전에 을 설정하십시오. 그러면 다시 저장되지 않습니다.

한 번에 하나의 요청 만 세션에 대한 읽기 - 수정 - 쓰기 작업을 수행 할 가능성이 적습니다. 앞으로 Connect는보다 정확한 세션 미들웨어를 갖기를 희망합니다. 물론 API는 현재 가지고있는 것보다 더 복잡 할 것입니다.

+1

답장을 보내 주셔서 감사합니다. 불행히도 이것은 내 문제를 해결하지 못했습니다. 정적 미들웨어를 세션 미들웨어 위에 놓았지만 할 수있는 모든 것에 관한 것이 었습니다. 모든 경로 (4 개만)는 세션을 직접 사용하거나 세션을 사용하는 미들웨어를 통과시킵니다. 다른 생각? – ehynds

+0

큰 설명에 감사드립니다. 추적하기 위해 연결 문제를 열었습니다. https://github.com/senchalabs/connect/issues/854 – Matt

+0

mg. 귀하의 1. 해결책은 그것을 고쳤습니다. 어떤 이유로 POST에서 POST 사이에 세션이 중단되었습니다. 나는 이유를 몰랐다. 하지만 방금했습니다. 세션 미들웨어 위에서 정적을 움직이면 작동합니다! –

4

나는 issue against Express about github을 제출했지만 몇 분 후에 무엇이 잘못되었는지 알아 냈습니다.동일한 문제가 있지만 완전성을 위해 확실하지 않은 경우 :

제 경우에는 http://localhost:8003으로 테스트했지만 OAuth 제공 업체는 http://hostname:8003으로 리디렉션 중입니다. 동일한 상자/서버/웹 페이지이지만 도메인 이름이 다르다는 것은 브라우저가 다른 쿠키를 보내고 결과적으로 express가 다른 세션 ID와 세션 데이터를 얻음을 의미합니다. http://hostname:8003에서 테스트를 시작하자마자 모든 것이 잘 작동했습니다.

0

내 코드는 구조적으로 유사합니다. 내 경우, POST 작업은 JQuery $ .post 함수에서 비롯된 것입니다. 즉 상당한 차이가 있는지 내가 할 필요 결국 무엇 그러나

, 내 고속 라우팅 일상에서 POST 작업 정의의 끝에서 "정크"응답을 보낼 수 있었다 몰라

res.send("hoo hee ha ha unimportant junk data");

마지막에 이것을 포함하여 성공 함수 (AJAX 게시 시도 콜백)를 트리거 할 수있었습니다. 표현 경로에 배치하는 대신 리디렉션을 삽입했습니다. 와

를 사용하여 AJAX 포스트 AJAX 포스트와 함께 사용하지 마십시오 window.redirect();

: $res.redirect("someurl");

이것은 당신이 자바 스크립트를 사용 할 수 있도록 여기에 설명 된대로 브라우저 분명히, AJAX 응답에 리디렉션하지 않기 때문입니다 : Express js - can't redirect

누군가를 도우려는 호프가 나를 위해 문제를 해결해주었습니다. 평화.

+0

나는 조금 늙은 사랑한다 '고 하하하. 꽤 좋아하는 것은 없습니다. –

5

같은 문제로 고생하고 해결되었습니다. 간단한 대답은 응답의 끝에서 당신을 위해 전화를 명시 세션에 응답 할 수없는 경우, 명시 적으로

Session.save() 

를 호출하는 것입니다.

Reference