【问题标题】:Expressjs: Rendering views depending on application stateExpressjs:根据应用程序状态渲染视图
【发布时间】:2023-03-10 09:30:01
【问题描述】:

我正在创建快速应用程序,我的应用程序可容纳两种状态 - 登录用户和匿名用户。我的应用不需要用户登录即可查看网站内容。目前,状态由 cookie 决定,如果 myapp_token cookie 存在,则 app 使用此 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();
        };
    };

我的 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.:如何调试节点中的视图?例如,如何找到可用的变量以及它们在特定视图中包含的内容?

谢谢!

【问题讨论】:

  • 我没有看到您正在做的任何重大问题...要调试,您可以使用 console.log(locals)。 Locals 是 express 用于局部变量(res.locals 和 app.locals)的。
  • 你可以像这样在玉中做到这一点:-console.log(locals)
  • 感谢您的回复!我想问题是视图在我用数据加载会话之前呈现。我需要的是等待 getUserInfo() api 调用完成,并且只有在我得到它之后才呈现视图......关于如何做到这一点的任何建议?
  • 添加了官方答案。这有帮助吗?

标签: javascript node.js session express pug


【解决方案1】:

我没有看到您对 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();
       }

      }); 


    };
};

这样next 在您的 API 调用完成之前不会被调用,因此您的中间件将使请求等待并且在获得数据之前不会呈现视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 2021-08-15
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多