【问题标题】:Why won't req.session set with node.js为什么不使用 node.js 设置 req.session
【发布时间】:2013-03-20 00:42:05
【问题描述】:

我似乎无法为

设置任何东西
req.session

我正在尝试将 oauth 令牌和秘密存储到会话中,以便在授权回调后检查它们。这是我的代码

var express = require('express'),
    app     = express(),
    server  = require('http').createServer(app),
    io      = require('socket.io').listen(server),
    oauth   = require('oauth'),
    tumblr  = require('tumblr.js'),
    client  = {
        consumer_key: '1n9fMPxCBFBbcIGRImYKSK5wwDL6yux64S4DxEwiwzHTNuaIoD',
        consumer_secret: 'bW9YKbnwgxexyVx1AaxQr1QoemEkjd29p5U1WpbZ8r1XEH41C0'
    },
    consumer = new oauth.OAuth(
        "http://www.tumblr.com/oauth/request_token", "http://www.tumblr.com/oauth/access_token",
        client.consumer_key, client.consumer_secret, "1.0A", "http://127.0.0.1:8080/sessions/callback", "HMAC-SHA1");

server.listen(1337);

app.configure('dev', function(){
    app.use(express.logger());
    app.use(express.bodyParser());
    app.use(express.cookieParser());
    app.use(express.session({ secret: "topsecret" }));
});


app.get('/home', function(req, res){
    consumer.getOAuthRequestToken(function(err, oauth_token, oauth_token_secret, results){
        if(err){
            console.log(err);
        }else{
            //req.session.oauth.token = oauth_token;
            console.log('oauth.token: ' + oauth_token);
            //req.session.oauth.token_secret = oauth_token_secret;
            console.log('oauth.token_secret: ' + oauth_token_secret);
            res.redirect('http://www.tumblr.com/oauth/authorize?oauth_token='+oauth_token);
        }
    });
});

app.get('/oauth/testapp', function(req, res){
    res.send('callback');
});

当我取消注释时

req.session.oauth.token = oauth_token;

我收到一个错误“无法读取未定义的属性 'oauth'”,req.session 在控制台中也显示未定义。

【问题讨论】:

    标签: javascript node.js oauth express


    【解决方案1】:
    var app = express();
    app.configure('dev', function() {
        app.use(express.logger());
        app.use(express.bodyParser());
        app.use(express.cookieParser());
        app.use(express.session({ secret: "topsecret" }));
        app.use(app.router); // You need to add the router after the express.session
    });
    

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      您正在尝试在会话上的对象oauth 上设置属性token。如果oauth对象未初始化,则为undefined,不能设置token属性。您首先需要在会话中初始化oauth 对象。例如,您可以这样做

      req.session.oauth = {token: theToken}
      

      这将在会话中创建一个对象,并设置该对象的token 属性。

      @robertklep 找到了解决方案的另一半:确保您在正确的环境中运行。由于您在app.configure 中使用了dev,因此您必须使用NODE_ENV=dev 运行节点才能应用配置。

      【讨论】:

      • 这似乎仍然不起作用我根本无法在 req.session 中设置任何内容。即使记录 req 我也看不到会话参数。 console.log(req.session) 显示未定义。
      • 使用新的 express 应用进行快速测试可以很好地处理会话,因此它必须与会话配置有关。尝试使用新的快递应用,看看是否有任何差异:express --sessions testsessions
      • @josh 听起来您没有在dev 环境中运行您的应用程序(NODE_ENV=dev node app.js,尽管它通常称为development)。中间件仅适用于该环境,因为您使用的是app.configure('dev', ...)。
      • 好点。我只是假设它在正确的环境下运行。明确检查环境是否设置正确。
      • @josh 我不介意 Nils 是否将他的答案扩充为包括环境部分,以便您可以接受他的答案,因为他也是对的 :)
      猜你喜欢
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      相关资源
      最近更新 更多