我正在开发一个需要使用express进行身份验证过程和会话管理的webapp。我已经完成了后端会话。现在我想在UI上显示已登录的用户.envateContent是一个验证某人是否已登录的函数,如下所示:
...
app.get( '/authRequired', queries.privateContent , routes.tasks );
...
这是queries.privateContent:
...
exports.privateContent = function ( req, res, next ) {
if ( req.session.user ) {
var username = req.session.user.username;
User.findOne( { 'username': username }, function ( err, obj ) {
if ( true ) {
next();
} else {
res.redirect('/');
}
});
} else {
res.redirect('/');
}
};
...
我想知道的是:我能够发送这样的数据吗? :
...
next( username );
...
如果是这样,我怎么能在routes.tasks渲染时检索它,如果发生如下(我试图在下面的代码中获取数据,但它不起作用。):
...
exports.my_tasks = function ( req, res, data ) {
console.log(data);
res.render('tasks/tasks',
{ title: 'Paraíso', controller: 'MyTasksController', user: data });
};
...
您可以猜到,我的意图是通过下一个登录到路由模块的当前用户,因此我可以使用jade在UI中打印用户名。 谢谢您的帮助。 :)
答案 0 :(得分:24)
在这种情况下,您有几个选项(仅使用其中一个!):
req
对象在exports.privateContent函数中,一旦在数据库中找到用户,您只需将该数据添加到res.locals:
User.findOne( { 'username': username }, function ( err, obj ) {
if ( true ) {
// this variable will be available directly by the view
res.locals.user = obj;
// this will be added to the request object
req.user = obj;
next();
} else {
res.redirect('/');
}
});
然后在您的exports.my_tasks路由中,res.locals.user
将是中间件中的obj。然后,您只需在视图中将其作为变量user
。
所以,总之,您可以通过以下方式访问路线中的数据:
exports.my_tasks = function ( req, res ) {
res.render('tasks/tasks', {
userFromReq: req.user, // this exists because you added in the middleware
userFromSession: req.session.user, // this was already in the session, so you can access
userFromRes: [DO NOT NEED TO DO THIS] // because res.locals are sent straight to the view (Jade).
});
};