Expressjs:根据应用程序状态呈现视图

时间:2013-12-04 22:56:11

标签: javascript node.js session express pug

我正在创建快速应用,我的应用程序可以容纳两种状态 - 登录用户和匿名用户。我的应用程序不需要用户登录才能查看该站点的内容。目前,状态由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。:如何在节点中调试视图?例如,如何找到可用的变量以及它们在特定视图中包含的内容?

谢谢!

1 个答案:

答案 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,因此您的中间件会使请求等待,并且在拥有数据之前不会呈现视图。