Node.js - How can I use my local variable with EJS view

10,137

Solution 1

Make sure that you are declaring that middleware function that sets res.locals.login before you declare your app.router. This ensures that the route rendering your template does not render the template before your middleware can set res.locals.login. Something along the lines of:

app.use(function (req, res, next) {
    res.locals.login = req.isAuthenticated();
    next();
});

app.configure(function(){
    ...
    app.use(app.router);
    ...
});

It appears others have asked a similar question, but with other templating engines: Accessing res.locals from Backbone.Router templates

Solution 2

or if you want to do without creating Middleware, you can also directly use following check in your ejs file:

if(locals.login) { .... }
Share:
10,137
Johnny
Author by

Johnny

Android developer since 2015 working with Kotlin and Jetpack 🚀 I worked in startups for the foodtech and babysitting industries. I had the chance to work through the full stack ReactJS, NodeJS and MongoDB.

Updated on June 28, 2022

Comments

  • Johnny
    Johnny almost 2 years

    I try to used my local variable on EJS. It's just a varaiable to check if the user is connected. -> Like the last post on this link: How to know if user is logged in with passport.js?

    So,

    app.js

    app.use(function (req, res, next) {
        res.locals.login = req.isAuthenticated();
        next();
    });
    

    view EJS

    <% if (login) { %>
          <div id="subMenuUser">
            <div class="btn-group">
              <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
                </span>Menu<span class="caret"></span>
              </button>
              <ul class="dropdown-menu pull-right" role="menu">
                <li><a href="#" role="menuitem">Menu Item 1</a></li>
                <li><a href="#" role="menuitem">Menu Item 2</a></li>
                <li><a href="#" role="menuitem">Menu Item 3</a></li>
              </ul>
            </div>
          </div>
     <% } %>
    

    I get an error:

    login is not defined
    

    I would like to use this variable with all view.. possible ?

    Before this method, I sent each time my variable in render like that:

    res.render('ad/index', { login: req.session.user });