【问题标题】:Another express.js req.session not storing data另一个 express.js req.session 不存储数据
【发布时间】:2014-04-26 16:21:00
【问题描述】:

我盯着同一个 SO 问题/答案看太久了。

我正在尝试在 req.session 变量中设置我的用户 ID

这是我的 app.js 堆栈

 /**
 * Module dependencies.
 */

 var express = require('express')
  , routes = require('./routes')
  , cors = require('cors')
  , mongoose = require('mongoose')
  , User = require('./user-model')
  , path = require('path')
  , mysql = require('mysql');

app = express()
/**
 * Middleware.
 */
app.use(cors());
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({ secret: 'supercalafragalistic' }));
app.locals.pretty = true;
app.use(express.static(path.join(__dirname, 'public')));
app.set('view engine', 'jade');
...
app.get('/someRoute', routes.someRoute)

我已将 app.router 从上到下移动。目前它是隐含的(我刚刚删除了它,因为我剥离了我的代码以寻找错误)。我已导出应用程序,包含在路线中的应用程序(也已删除)。我添加了中间件。我迷路了.....

这是我的路由堆栈

//routes/index.js
//requires
var  User = require('../user-model')
    ,qs = require('querystring')
    ,http = require('http')
    ,mysql = require('mysql')
    ,connection = mysql.createConnection({
         edited
    });

    /**
 * Set up application.
 */

    connection.connect(function(err){
        if(err) console.log('failed to connect to mysql because'+ err);
        else console.log('connected to mysql');
    })

我把id保存在登录路由中:

//login processing route
exports.logIn = function(req, res, next){
    console.log('log in request from '+req.body.name);
    User.findOne({name:req.body.name}, function(err, user, next){

        if(err) return next(err);
        if(!user) return res.end();

//check password
        user.comparePassword(req.body.password, function(err, isMatch){
            if(err) res.send('failed to find user');
            console.log(""+isMatch);
            if(isMatch){
                console.log(user._id.toString()+' user loggd in');
                //set session cookie
                req.session.loggedIn = user._id.toString();
                console.log('req.session.loggedIn set to :'+req.session.loggedIn );
                 res.send(user);

            }else {
               res.send('User not found try again'); 
            }

        });    
    });

但是,在所有其他路由中,该变量是未定义的:

// clock status
exports.clockStatus = function(req, res, next){
    var user = req.session.loggedIn;
    console.log('Status route, userID: '+user);
    if(user){

我在"Cannot access req.session variables in Express/NodeJS" 中找到了答案,但最后一部分已经消失了:

在您的情况下,您已分配 req.session.user = user;只有在 /登录请求。它将无法用于进一步的请求 (/auth)。

您也必须通过会话 ID 在 /auth 请求中获取用户信息。 (或)更好的是,您可以使用护照进行身份验证。

怎么样?您如何“通过会话 ID 在 /auth 请求中获取用户信息”?

请询问您需要解决的任何其他问题。 我难住了。我已经尝试了一些愚蠢的东西!

【问题讨论】:

  • 你用什么浏览器访问Express服务器?
  • Chrome 是首选浏览器。

标签: javascript node.js session express session-variables


【解决方案1】:

如果您没有先在浏览器中登录,则该变量在其他路由中未定义。这是我的测试代码:

var express = require('express');
var cors = require('cors');

app = express();

app.use(cors());
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({ secret: 'this is a test' }));

app.use(express.static(require('path').join(__dirname, 'public')));

app.get('/login', function(req, res) {
  req.session.uid = 'user001';
  res.send(req.session);
});


app.get('*', function(req, res) {
  res.send(req.session);
});

app.listen(8080);

首先在浏览器中访问http://localhost/login。然后在此浏览器中访问其他 URL(例如,http://localhost/test),返回会话中的用户 ID。因此,您的代码的其他部分可能有问题。

测试设置:

  • Ubuntu 桌面 13.10,64 位
  • 节点 0.10.26
  • NPM 1.4.4
  • Express 3.4.8
  • cors 2.2.0

【讨论】:

    猜你喜欢
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2020-09-24
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2012-06-21
    相关资源
    最近更新 更多