Синтаксическая ошибка: неожиданный токен «else» при компиляции ejs

#javascript #node.js #mongoose #compiler-errors

Вопрос:

Получена ошибка ниже при попытке добавить логику выпадающего списка на панель навигации. Ошибка:

 SyntaxError: /Users/myfile/app/views/layouts/boilerplate.ejs:22
    20| 
    21|   <body class="d-flex flex-column vh-100">
 >> 22|     <%- include('../partials/navbar') %> 
    23| 
    24|     <main class="container mt-5">
    25|         <%- include('../partials/flash') %> 

    Unexpected token 'else' in /Users/myfile/app/views/partials/navbar.ejs while compiling ejs

    If the above error is not helpful, you may want to try EJS-Lint:
    https://github.com/RyanZim/EJS-Lint
    Or, if you meant to create an async function, pass `async: true` as an option.
 

Вот моя навигационная панель:

 <nav class="navbar sticky-top navbar-expand-lg navbar-dark" style="background-color: #00305a;">
  <div class="container-fluid">
      <a class="navbar-brand" href="#">Company</a>
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup"
          aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
          <span class="navbar-toggler-icon"></span>
      </button>
    <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
        <div class="navbar-nav">
            <a class="nav-link active" href="#">Home</a>
            <a class="nav-link active" href="/events">Events</a>
            <a class="nav-link active" href="/artists">Artists</a>
        </div>
        <div class="navbar-nav ms-auto">
          <% if(currentUser) {%> 
            <li class="nav-item dropdown">
              <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
                Dropdown
              </a>
              <ul class="dropdown-menu" aria-labelledby="navbarDropdown">
                <li><a class="dropdown-item" href="/artists/<%=artist.id%>/edit">Edit profile</a></li>
                <li><a class="dropdown-item" href="/logout">Logout</a></li>
              </ul>
              <% } %> 
            </li>  
          <a class="nav-link active" href="/logout">Logout</a>
            <% } else { %> 
              <a class="nav-link active" href="/login">Login</a>
              <a class="nav-link active" href="/artists/new">Sign Up</a>
            <% } %>
      </div>
    </div>
  </div>
</nav>
 

Вот часть моего шаблонного макета, которая включает навигационную панель:

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Boilerplate!!</title>

</head>

       <body class="d-flex flex-column vh-100">
         <%- include('../partials/navbar') %> 
     <main class="container mt-5">
         <%- include('../partials/flash') %> 
         <%- body %>
     </main> 

     <%- include('../partials/footer') %> 


 </body>

 </html>
 

Я думаю, это потому, что я должен определить глобальную переменную на своем app.js но не уверен, что это именно так. Включая мое приложение.используйте переменные для контекста:

 app.use((req, res, next) => {
    console.log(req.session);
    res.locals.currentUser = req.user;
    res.locals.success = req.flash('success');
    res.locals.error = req.flash('error');
    next();
})
 

Как мне открыть раскрывающийся список на панели навигации, чтобы пользователь мог «редактировать» свой профиль?

Комментарии:

1. Вы должны if () { }} else удалить <% } %> или переместить остальное вверх

2. Когда я это делаю, я получаю ошибку»исполнитель не определен» из строки <li><li><a class= «выпадающий список» href=»/исполнители/<%=artist.id%>/изменить»<%=artist.id%>>Изменить профиль<%=artist.id%>></a></a></li>. Вот почему я думал, что должен определить это глобально?

Ответ №1:

У вас есть дополнительная <% } %> html-страница на панели навигации. Просто удалите этот тег после </ul>

Комментарии:

1. Спасибо @ашан Джамал, вы правы, мне действительно нужно удалить эту скобку, но когда я это делаю, я получаю ошибку»исполнитель не определен» из строки <li><li><a class=»выпадающий список» href= «/художники/<%=artist.id%>/изменить»<%=artist.id%>>Редактировать профиль<%=artist.id%>></a></a></li>. Вот почему я думал, что должен определить это глобально?

Ответ №2:

Понял это— Мне пришлось изменить имя переменной ejs, потому что я уже определил текущего пользователя:

От: href=»/исполнители/<%=artist.id%>/изменить»<%=artist.id%>>Изменить профиль

Кому: href=»/исполнители/<%=currentUser.id%>/изменить»<%=currentUser.id%>>Изменить профиль

Идентификатор художника уже был передан в CurrentUser, поэтому я смог вытащить его оттуда.