Получение параметров url в шаблоне ejs

Я пытаюсь создать условие ejs на основе URL-параметра, например, если тестовый параметр существует в localhost: 3000/page? test, а затем показать div, иначе не показывать его.

Мой шаблон ejs выглядит примерно так:

<% include header %>
<div class="row">
<%if (title !== "homepage") {%>
<%= title %>
  <div>
    <% include nav %>
  </div>
<%}%>
  <div>
  </div>
</div>
<% include footer %>

Есть ли способ получить доступ к параметрам URL непосредственно из файла ejs? Например, <% = title% > отлично работает, есть ли что-то вроде <% = req.query% > ?

Я также использую выражение.

Ответ 1

Вы можете легко передать его как объект во втором аргументе render()

app.get('/someurl', function(req, res, next) {
   res.render('filename', {query : req.query});
});

Вы также можете использовать переменную locals

app.get('/someurl', function(req, res, next) {
   res.locals.query = req.query;
   res.render('filename');
});

что очень полезно при использовании с общим маршрутом, который выполняется перед всеми другими маршрутами, делая переменную доступной во всех следующих маршрутах

app.use(function(req, res, next) {
   res.locals.query = req.query;
   res.locals.url   = req.originalUrl;

   next();
});

и он доступен в файле, который вы показываете как query и т.д.

<% if (query == "something") { %>
    <div id="crazy_shit">
        <a href="<%- url -%>">Here</a>
    </div>
<% } %>

Как побочный элемент, если query по какой-либо причине не определен, вы получите сообщение об ошибке в EJS для использования переменной undefined, что может раздражать.

Я обычно решаю это, используя вместо этого объект, поскольку проверка свойств объекта не вызывает ошибок, и легко убедиться, что объект всегда имеет начальное значение в верхней части каждого шаблона EJS.
Это делается на маршрутах

app.user(function(req, res, next) {
   res.locals.stuff = {
       query : req.query,
       url   : req.originalUrl
   }

   next();
});

И затем в шаблоне

<% stuff = typeof stuff !== 'object' ? {} : stuff %>

// later on

<% if ( stuff.query == "something") { %>//does not throw error if property not defined
    <div id="crazy_shit"></div>         
<% } %>

который даже если stuff.query определен, условие просто терпит неудачу и не выдает ошибки, как если бы он не был сам stuff или любая другая переменная.

Ответ 2

<%= req.query.paramName %>

Работает для меня, где paramName - это имя вашего параметра запроса URL.