Search code examples
node.jsexpresspassport.js

How to check in layout if user is logged in


Like in title. I have layout:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
     <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css" integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s/" crossorigin="anonymous">
    <link
      rel="stylesheet"
      href="https://bootswatch.com/4/journal/bootstrap.min.css"
    />
    <title>Node.js & Passport Login App</title>
  </head>
  <body>
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarColor03" aria-controls="navbarColor03" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
      </button>

      <div class="collapse navbar-collapse" id="navbarColor03">
        <ul class="navbar-nav mr-auto">
          <form class="form-inline my-2 my-lg-0">
            <input class="form-control mr-sm-2" type="text" placeholder="Search">
            <button class="btn btn-secondary my-2 my-sm-0" type="submit">Szukaj!</button>
          </form>
          <li class="nav-item active">
            <a class="nav-link" href="/index">Strona Główna
              <span class="sr-only">(current)</span>
            </a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#">O nas</a>
          </li>
        </ul>
        <ul class="navbar-nav">
          <li class="nav-item">
            <%if (!isLoggedIn) { %>
              <div> <a class="nav-link" href="/users/logout">Wyloguj</a></div>
            <% } %>
              <%if (isLoggedIn) { %>
                <div> <a class="nav-link" href="/users/login">Zaloguj</a></div>

              <% } %>

          </li>
        </ul>
      </div>
    </nav>
    <div class="container"><%- body %></div>

    <script
      src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
      integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
      crossorigin="anonymous"
    ></script>
    <script
      src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js"
      integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut"
      crossorigin="anonymous"
    ></script>
    <script
      src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js"
      integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k"
      crossorigin="anonymous"
    ></script>
  </body>
</html>

and some routes like e.g register view,where I check if user isLogged(no way to registration) etc.

router.get('/register', (req, res) =>
    res.render('register',{isLoggedIn:isLoggedIn()}));

I have 2 problems:

1)<%if> in my layout doesn't work (i don't know why)

2)How to inject state of user (logged or not) to layout? I don't want to repeat all of the code from layout on my views.


Solution

  • I solved my problem - thanks to @Fide for show me a way where is a bug!

    router.get('/register',
        function (req,res){
        res.render('register', {user: req.User} )
        });
    

    I have to take User from req - simple but I spent a lot of time on it!