【发布时间】: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