Embedded JS Partials - 确定用户是不是登录

Posted

技术标签:

【中文标题】Embedded JS Partials - 确定用户是不是登录【英文标题】:Embedded JS Partials - Determining whether a user is logged inEmbedded JS Partials - 确定用户是否登录 【发布时间】:2016-05-09 03:10:23 【问题描述】:

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

我正在尝试为用户是否登录显示不同的模板。我查看了此页面以确定用户是否已登录

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 没有​​定义。

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

【问题讨论】:

【参考方案1】:

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

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

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

例如

 loggedin: true, username: 'someone' 

或以上几行。

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

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

【讨论】:

感谢您的回答。但是,我将 req 参数传递给了我的 app.get('/') 块,但我仍然收到相同的消息。我错过了什么吗? 看第二个例子。如果你传递 req 对象,那么你可以访问user 而不是req.user。您正在传递一个对象,并且它的属性在模板中公开。现在我发现我的回答并不是 100% 清楚。我将编辑我的答案,这样就不会再令人困惑了。 传入对象似乎可以解决这个问题。但我认为你的第二个解决方案更好

以上是关于Embedded JS Partials - 确定用户是不是登录的主要内容,如果未能解决你的问题,请参考以下文章

javascript 忽略scss partials

何时使用 Helpers 而不是 Partials

如何在 TypeScript 中定义一个 Partials 数组?

scss 使用Partials将您的样式拆分为较小的块

如何正确设置 Ejs Partials

在 rails partials 中添加 css 类的优雅方式