我正在尝试基于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参数?例如,<%= title%>工作正常,有没有像<%= req.query%>?
我也用快递.
解决方法
您可以在第二个参数中轻松地将其作为对象传递给render()
app.get('/someurl',function(req,res,next) { res.render('filename',{query : req.query}); });
您也可以使用本地变量
app.get('/someurl',next) { res.locals.query = req.query; res.render('filename'); });
当与在所有其他路由之前运行的一般路由一起使用时,这是非常有用的,使得变量可用于以下所有路由
app.use(function(req,next) { res.locals.query = req.query; res.locals.url = req.originalUrl; next(); });
<% if (query == "something") { %> <div id="crazy_shit"> <a href="<%- url -%>">Here</a> </div> <% } %>
作为旁注,如果没有定义查询某些原因,那么在EJS中会出现一个使用未定义变量的错误,这可能会令人讨厌.
我通常通过使用对象来解决这个问题,因为检查对象属性不会触发错误,并且很容易确保该对象始终在每个EJS模板顶部具有初始值.
在路线上这样做
app.user(function(req,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,条件也就失败了,它不会抛出一个错误,就像它自己或任何其他变量没有被定义一样.