获取ejs模板中的url参数

时间:2013-11-21 20:11:48

标签: javascript node.js express ejs

我正在尝试基于URL参数创建一个ejs条件,例如,如果测试参数存在于localhost:3000 / page?test,那么显示一个div,否则不显示它。

我的ejs模板看起来像:

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

有没有办法直接从ejs文件访问URL参数?例如,&lt;%= title%&gt;工作得很好,是否有像&lt;%= req.query%&gt;?

我也在使用快递。

3 个答案:

答案 0 :(得分:13)

您可以轻松地将其作为第二个参数中的对象传递给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中使用未定义变量时会出现错误,这可能很烦人。

我通常使用对象来解决这个问题,因为检查对象属性不会触发错误,并且很容易确保对象始终在每个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本身或任何其他变量那样抛出错误。

答案 1 :(得分:6)

<%= req.query.paramName %>

适合我,其中paramName是您的网址查询参数的名称。

答案 2 :(得分:0)

只需以易于检索的查询形式发送内容

app.get('/category', function(req, res) {
  var string = stuff
  res.redirect('/?valid=' + string);
}); 

在ejs模板中,您可以直接使用参数名称

<% var k = valid %>