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

Javascript Expressjs:根据应用程序状态呈现视图,javascript,node.js,session,express,pug,Javascript,Node.js,Session,Express,Pug,我正在创建express应用程序,我的应用程序支持两种状态-登录用户和匿名用户。我的应用程序不要求用户登录才能查看网站内容。当前,状态由cookie确定,如果存在myapp_令牌cookie,则应用程序使用此cookie的值进行API请求(我无法更改此行为) 我需要根据用户是否登录,以不同方式呈现我的express应用程序中的某些视图。例如,我有一个顶部导航,如果登录,将显示用户配置文件图片,如果没有,则显示“登录”链接等 其他一些观点也会根据州的不同而有所改变,希望你有个想法 我的问题是决定我

我正在创建express应用程序,我的应用程序支持两种状态-登录用户和匿名用户。我的应用程序不要求用户登录才能查看网站内容。当前,状态由cookie确定,如果存在myapp_令牌cookie,则应用程序使用此cookie的值进行API请求(我无法更改此行为)

我需要根据用户是否登录,以不同方式呈现我的express应用程序中的某些视图。例如,我有一个顶部导航,如果登录,将显示用户配置文件图片,如果没有,则显示“登录”链接等

其他一些观点也会根据州的不同而有所改变,希望你有个想法

我的问题是决定我应该用什么方法来处理这个问题。我最初的想法是创建中间件,它将根据状态设置
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();
        };
    };
My 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在我看来是可行的。但是我得到一个错误
无法读取未定义的属性“imageUrl”
我的路线是这样的

// 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);
}
我做这件事的方式可能很糟糕(我是node新手),这是
app.get('/*',session(app),routes.index)背后的原因是我只想检查路由请求上的会话状态。我试着使用(..)
,但它也会在静态文件请求上运行中间件

注意:如何调试节点中的视图?例如,如何在特定视图中找到可用的变量及其包含的内容


谢谢

我看不到您对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
,因此中间件将使请求等待,并且在获得数据之前不会呈现视图。

我看不到您所做的有任何重大问题。。。要进行调试,可以使用console.log(局部变量)。局部变量是express用于局部变量(res.Locals和app.Locals)的内容。您可以在jade中这样做:
-console.log(Locals)
谢谢您的回复!我想问题是视图在我加载会话数据之前呈现。我需要的是等待getUserInfo()api调用完成,并且只有在得到它之后才能渲染视图。。。“有什么建议我可以这样做吗?”补充了一个官方答案。这有用吗?