一尘不染

Node.js和Express会话问题

node.js

我在会话方面遇到问题,有时我 刚刚 设置的会话变量在下一页请求中未定义。为了正确设置变量,我通常必须再次执行该流程。

我可以确认我没有尝试将会话变量设置为undefined。他们有合法的价值。

在我的应用中,用户从/ twitter / connect /移至/ twitter / callback
/。前者从Twitter检索一些oauth数据,后者将用户登录到Twitter。

/ twitter / connect /很简单:

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

之后,twitter将它们发送回/ twitter / callback /:

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

我不知道发生了什么,我可以确认会话变量设置正确,它们只是在第一次请求时才在页面请求之间保持其值不变。

这就是我创建服务器的方式:

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上也看到了这个问题。我正在使用Express 2.3.2。

任何帮助深表感谢。


阅读 233

收藏
2020-07-07

共1个答案

一尘不染

只是在同一个问题上挣扎并得到解决。简单的答案是打电话

 Session.save()

明确地讲,如果您不能在快速会话上回复,则在响应结束时为您调用它。

参考

2020-07-07