【问题标题】:Cannot get session data from middleware in node.js无法从 node.js 中的中间件获取会话数据
【发布时间】:2016-04-21 03:46:21
【问题描述】:

我有一个函数可以在用户注册时获取她的 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 检查本地是否有 id 并显示正确的菜单

<%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

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

谢谢

【问题讨论】:

  • 如何将req 传递给用户代码?
  • 你确定user中的app.use(user);是中间件的功能吗(这里找一个require错误...)
  • @robertklep 通过这一行 module.exports = function(req,res,next){ 。我猜req 在那里,应该可以解决问题
  • @Cyrbil 起初我是 var user = require('./lib/middleware/user'); 。这包含了中间件的全部代码。然后我做app.use(user);
  • req.session.uid = id;你永远不会调用 next()。只有在请求结束或显式调用 save() 时,Express-session 才会保存会话

标签: node.js session express middleware


【解决方案1】:

注意:我不能确定这是您的错误,因为您没有将代码粘贴到 user.save() 周围。但我有足够的信心这就是原因。

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

我可以在这里看到:

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

你要么:

  • 无法保存新用户并使用next(err)(结束 HTTP 响应)继续该过程
  • 或者成功了,但可能会卡住(

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

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

【讨论】:

    猜你喜欢
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 2023-03-09
    • 1970-01-01
    • 2018-06-25
    • 2018-10-31
    • 2016-04-02
    相关资源
    最近更新 更多