无法从node.js中的中间件获取会话数据

时间:2016-01-15 14:12:37

标签: node.js session express middleware

我有一个函数,当她注册

时获取用户的id
            user.save(function(err, id){
                if(err) return next(err);
                req.session.uid=id;                         
            })

然后,我写了这个中间件

var User = require('../user');//contains the code above
module.exports = function(req,res,next){
    var uid = req.session.uid;
    if(!uid) return next();//if not logged in
    else{//else is logged in
        User.get(uid, function(err, user){
            //get user object and pass it to locals
            if (err) console.log("error from midd > "+err);
            req.user = res.locals.user = user;
            next();
        })
    }
}

我在app.js中定义了我的中间件,如此

var user = require('./lib/middleware/user');
app.use(session({resave:'false', saveUninitialized:'false', secret:'secret'}));
app.use(user);  //<-- my middleware
app.use(express.static(path.join(__dirname, 'public')));
app.set('multimedia', __dirname + '/public/multimedia');
app.use(messages);
app.get('/register', register.form);
app.post('/register', register.submitit);

然后我检查当地人是否有身份证,并使用ejs显示正确的菜单

<%if (locals.user) {%>
  <div id='menu'>
  <a href='/post'>post</a> 
  <a href='/logout'>logout</a>
</div>

<%}else{ %>

<div id='menu'>
  <a href='/login'>login</a> 
  <a href='/register'>sign up</a>
</div>
<%}%>

这永远不会奏效。在每个页面中,即使我已注册,我也从未看到注册用户的菜单(发布和注销)。

我在代码中放了很多console.log,看起来中间件永远不会得到session.uid

中间件中的

console.log("req.session.uid = "+req.session.uid);总是提供未定义的,即使保存用户工作并返回我传递给会话req.session.uid=id;

的ID

我该如何解决这个问题?请告知,因为我被卡住了。

由于

1 个答案:

答案 0 :(得分:0)

注意:我无法确定这是您的错误,因为您没有粘贴代码user.save()。但我完全相信这是原因。

  

Session.Save() :如果会话数据已被更改,则会在HTTP响应结束时自动调用此方法(尽管此行为可以更改为中间件构造函数中的各种选项)。因此,通常不需要调用此方法。

我在这里可以看到:

 user.save(function(err, id){
     if(err) return next(err);
     req.session.uid=id;                         
 })

你要么:

  • 无法保存新用户并使用next(err)(结束HTTP响应)继续此过程
  • 或者成功并且可能会卡住(&lt; =没有足够的代码显示知道什么......)

如果成功,您应该致电next()next(null)

因此,永远不会保存更改的会话(即:req.session.uid=id;)。因此,导致检索中间件中的uid失败。