【问题标题】:Cannot access user properties (passed as res.locals.user) using express and hbs view无法使用 express 和 hbs 视图访问用户属性(作为 res.locals.user 传递)
【发布时间】:2022-01-04 12:32:41
【问题描述】:

我使用此代码检查用户令牌是否正确,并将用户放入 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();
};

之后,我渲染视图。这是我的标题,这里应该显示用户名,但它似乎是空的。有一个用户,它不是空的,但由于某种原因我无法使用 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>

有什么想法吗?

UPD 添加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');
};

【问题讨论】:

  • 为什么要在 HBS 中提供它?您没有显示任何运行 HBS 的代码,更不用说将来自 locals 的数据传递给它。
  • 更新了,这里是hbs的配置和渲染方法

标签: javascript node.js express handlebars.js


【解决方案1】:

Express 中的视图无权访问请求对象。他们只能访问作为locals 参数传递的对象中的数据:

const locals = { put: "some data here" };
res.render('home', locals);

您根本没有传递任何数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-30
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 2017-05-17
    相关资源
    最近更新 更多