我正在创建快速应用,我的应用程序可以容纳两种状态 - 登录用户和匿名用户。我的应用程序不需要用户登录才能查看该站点的内容。目前,状态由cookie决定,如果存在myapp_token cookie,那么app会使用此cookie的值来发出API请求(我无法改变此行为)。
我需要在我的快递应用中呈现不同的视图,具体取决于用户是否登录。例如,我有一个顶级导航,如果登录,则显示用户个人资料图片,如果不是,我想显示'登录'链接等。
其他一些观点也将根据州的情况而改变,希望你有所了解。
我的问题是确定我应该用来处理这个问题的方法。我最初的想法是创建中间件,根据状态设置app.local.session
变量,然后我会在我的视图中访问它,并且有条件可以检查要打印的内容。
// session.js
module.exports = function(app) {
return function(req, res, next) {
if(req.cookies['app_token']) {
var session = new Session(req.cookies['app_token']);
res.locals.session = session.user;
} else {
console.log('nothing... ' + req.cookies['app_token']);
}
next();
};
};
我的session.js向我的api服务器发出http请求以获取用户信息,然后将用户数据存储在session.user字段中。
// navbar.jade
ul.nav.navbar-nav.navbar-right
li: a(href="#")#profile-fix
img(alt="" src="#{session.userProfile.imageUrl}").profile-img
span.user-name #{session.userProfile.userName}
我认为app.locals在我看来是可用的。但是我收到错误Cannot read property 'imageUrl' of undefined
我的路线看起来像这样。
// routes.js
var routes = require('./handlers');
var session = require('./middlewares/session');
module.exports = function(app) {
app.get('/*', session(app), routes.index);
// app.get('/logout', session.logout);
app.get('/:location?/:category?', routes.index);
}
我这样做的方式可能很讨厌(我对节点不熟悉),这个app.get('/*', session(app), routes.index);
背后的原因是我只想检查路由请求的会话状态。我试图做app.use(....)
,但它也会在静态文件请求上运行中间件。
P.S。:如何在节点中调试视图?例如,如何找到可用的变量以及它们在特定视图中包含的内容?
谢谢!
答案 0 :(得分:0)
我没有看到你对getUserInfo的调用,但我假设它有一个回调。所以我要做的是:
// session.js
module.exports = function(app) {
return function(req, res, next) {
//make API call
//assuming one of the params is a callback
getUserInfo(function(err, data){
if (err) return next(err); //if you want to cause an error
if (data) {
res.locals.session = data.user;
} else {
console.log('nothing... ' + data);
}
next();
}
});
};
};
这种方式在API调用完成之前不会调用next
,因此您的中间件会使请求等待,并且在拥有数据之前不会呈现视图。