javascript - 嵌入式 JS Partials - 确定用户是否登录

标签 javascript node.js express

我正在尝试在nodejs中设置用户身份验证。我使用嵌入式 js 作为 View 引擎。

我试图显示一个不同的模板来判断用户是否登录。我查看此页面以确定用户是否已登录

How to know if user is logged in with passport.js?

在标题部分中,我希望用户仅在未登录的情况下看到登录和注册链接。我包含了此 ejs。

<header>
    <% include header %>
</header>

然后在我的标题部分中,我有这个

<ul class="nav navbar-nav">
    <% if (!req.user) {%>
        <li><a href='login.ejs'>Login</a></li>
        <li><a href='register.ejs'>Register</a></li>
    <% } %>
</ul>

这是我的routes.js 文件

module.exports = function(app) {

    app.set('view engine', 'ejs');

    app.use(express.static(path.resolve('shapes')));

    app.get('/', function(req, res) {
        res.render(path.resolve('shapes/index'));
    });

    passport.serializeUser(function(user, done) {
        done(null, user);
    });

    passport.deserializeUser(function(user, done) {
        done(null, user);
    });

    passport.use(new LocalStrategy(function(username, password, done) {
        process.nextTick(function() {
            UserDetails.findOne({
                'username': username, 
            }, function(err, user) {
                if (err) {
                    return done(err);
                }

                if (!user) {
                    return done(null, false);
                }

                if (user.password != password) {
                    return done(null, false);
                }

                return done(null, user);
            });
        });
    }));

    app.get('/login', function(req, res) {
        res.sendFile(path.resolve('shapes/login.ejs'));
    });

    app.get('/register', function(req, res) {
        res.sendFile(path.resolve('shapes/register.ejs'));
    });

    app.post('/login', passport.authenticate('local', {
        successRedirect: '/',
        failureRedirect: '/login'
    }));

    app.get('/logout', function(req, res){
        req.logout();
        res.redirect('/');
    });

    function isLoggedIn(req, res, next) {

        // if user is authenticated in the session, carry on 
        if (req.isAuthenticated())
            return next();

        // if they aren't redirect them to the home page
        res.redirect('/');
    }

};

我重新加载服务器并发现 req 未定义。

问题似乎是在我的 header 部分中包含此变量。

最佳答案

为了向模板公开变量,您必须传递它。 例如

res.render(path.resolve('shapes/index'), {req: req});

以上内容会将 req 公开给模板。但是,您不应将完整的 req 对象暴露给模板。您可以简单地传递一个包含您想要在特定模板中拥有的所有属性的对象。

例如

{ loggedin: true, username: 'someone' }

或上面几行中的内容。

然后在您的模板中您可以检查

if (!loggedin) {
    // show here the login and register partial, etc.
}

关于javascript - 嵌入式 JS Partials - 确定用户是否登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35117454/

相关文章:

node.js - 在路由中访问 app.js 变量但没有全局 express

javascript - 如何提供静态文件并将其路径提供给一个用户?

javascript - 使用 jQuery 通过其 ID 属性选择 HTML 元素

Mysql 单独使用 sql 语句插入多行逗号分隔值

javascript - 仅选择 d3 中的子集

javascript - 使用 Multer 在 Express JS 中无法上传文件

javascript - 为什么 Nodejs usb 模块与 Electron 冲突?

express - 如何在同一个 express 服务器上同时运行客户端和 API?

javascript - 异步 Mocha 测试如何在不返回 promise 或调用完成回调的情况下解决

javascript - 奇怪的单引号转义