无法使用 express 和 hbs 视图访问用户属性(作为 res.locals.user 传递)
Cannot access user properties (passed as res.locals.user) using express and hbs view
我用这段代码检查用户令牌是否正确,并将用户放入req.locals
exports.isLoggedIn = async (req, res, next) => {
if (req.cookies.jwt) {
try {
const decoded = await promisify(jwt.verify)(
req.cookies.jwt,
process.env.JWT_SECRET
);
const currentUser = await User.findById(decoded.id);
if (!currentUser) {
return next();
}
if (currentUser.changedPasswordAfter(decoded.iat)) {
return next();
}
res.locals.user = currentUser;
return next();
} catch (err) {
return next();
}
}
next();
};
之后,我渲染视图。这是我的header,这里应该显示用户名,但好像是空的。有一个用户,它不是空的,但由于某种原因我无法使用 hbs
直接访问他的名字
<nav class="navbar navbar-dark navbar-expand p-0 bg-dark">
<div class="container">
{{#if user}}
<ul class="navbar-nav d-none d-md-flex mr-auto">
<li class="nav-item"><a class="nav-link logout" href="/users/logout" data-abc="true">Log Out</a></li>
</ul>
<ul class="navbar-nav d-flex align-items-center">
<li class="nav-item">
<div class="d-flex flex-row"><img src="https://i.imgur.com/EYFtR83.jpg" class="rounded-circle"
width="30"></div>
</li>
<li class="nav-item"><a href="#" class="nav-link d-flex align-items-center" data-abc="true">
<span>{{user.name}}</span>
<i class='bx bxs-chevron-down'></i></a>
</li>
</ul>
{{else}}
<ul class="navbar-nav d-none d-md-flex mr-auto">
<li class="nav-item"><a class="nav-link" href="/users/login" data-abc="true">Log In</a></li>
<li class="nav-item"><a class="nav-link" href="/users/signup" data-abc="true">Sign Up</a></li>
</ul>
{{/if}}
</div>
有什么想法吗?
更新
添加了呈现页面的 hbs 配置和控制器功能
app.set('view engine', 'hbs');
hbs.registerPartials(__dirname + "/views/partials");
app.engine("hbs", engine ({
layoutsDir: "views/layouts",
defaultLayout: "layout",
extname: "hbs"
}
));
此外,这是呈现页面的控制器方法
exports.getHomePage = async (req, res, next) => {
res.render('home');
};
Express 中的视图无权访问请求对象。他们只能访问作为 locals
参数传递的对象中的数据:
const locals = { put: "some data here" };
res.render('home', locals);
您根本没有传递任何数据。
我用这段代码检查用户令牌是否正确,并将用户放入req.locals
exports.isLoggedIn = async (req, res, next) => {
if (req.cookies.jwt) {
try {
const decoded = await promisify(jwt.verify)(
req.cookies.jwt,
process.env.JWT_SECRET
);
const currentUser = await User.findById(decoded.id);
if (!currentUser) {
return next();
}
if (currentUser.changedPasswordAfter(decoded.iat)) {
return next();
}
res.locals.user = currentUser;
return next();
} catch (err) {
return next();
}
}
next();
};
之后,我渲染视图。这是我的header,这里应该显示用户名,但好像是空的。有一个用户,它不是空的,但由于某种原因我无法使用 hbs
直接访问他的名字<nav class="navbar navbar-dark navbar-expand p-0 bg-dark">
<div class="container">
{{#if user}}
<ul class="navbar-nav d-none d-md-flex mr-auto">
<li class="nav-item"><a class="nav-link logout" href="/users/logout" data-abc="true">Log Out</a></li>
</ul>
<ul class="navbar-nav d-flex align-items-center">
<li class="nav-item">
<div class="d-flex flex-row"><img src="https://i.imgur.com/EYFtR83.jpg" class="rounded-circle"
width="30"></div>
</li>
<li class="nav-item"><a href="#" class="nav-link d-flex align-items-center" data-abc="true">
<span>{{user.name}}</span>
<i class='bx bxs-chevron-down'></i></a>
</li>
</ul>
{{else}}
<ul class="navbar-nav d-none d-md-flex mr-auto">
<li class="nav-item"><a class="nav-link" href="/users/login" data-abc="true">Log In</a></li>
<li class="nav-item"><a class="nav-link" href="/users/signup" data-abc="true">Sign Up</a></li>
</ul>
{{/if}}
</div>
有什么想法吗?
更新 添加了呈现页面的 hbs 配置和控制器功能
app.set('view engine', 'hbs');
hbs.registerPartials(__dirname + "/views/partials");
app.engine("hbs", engine ({
layoutsDir: "views/layouts",
defaultLayout: "layout",
extname: "hbs"
}
));
此外,这是呈现页面的控制器方法
exports.getHomePage = async (req, res, next) => {
res.render('home');
};
Express 中的视图无权访问请求对象。他们只能访问作为 locals
参数传递的对象中的数据:
const locals = { put: "some data here" };
res.render('home', locals);
您根本没有传递任何数据。