【发布时间】: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