在 ejs 模板中获取 url 参数

Posted

技术标签:

【中文标题】在 ejs 模板中获取 url 参数【英文标题】:Getting the url parameters in an ejs template 【发布时间】:2013-12-06 12:18:24 【问题描述】:

我正在尝试基于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 参数?例如, 工作正常,是否有类似 的东西?

我也在用快递。

【问题讨论】:

【参考方案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 中因使用未定义的变量而出现错误,这可能很烦人。

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

【讨论】:

另外,您可以在路由中间件之前有一个自定义中间件,如下所示:app.use(function (req, res, next) res.locals.some_var='var';next(););。这样 var 将在所有视图中可用。用于传递req 数据,例如用于导航的 url 路径。【参考方案2】:
<%= req.query.paramName %>

对我有用,其中paramName 是您的 URL 查询参数的名称。

【讨论】:

【参考方案3】:

只是以查询的形式发送的东西,可以很容易地检索到

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

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

<% var k = valid %>

【讨论】:

以上是关于在 ejs 模板中获取 url 参数的主要内容,如果未能解决你的问题,请参考以下文章

nodejs之静态文件托管 路 由EJS 模板引擎GETPOST

在 ejs 模板文件中使用 mongoose 获取数据

10_常见的get和post请求_路由器_ejs服务器渲染模板引擎

如何在 ejs 模板中使用数组显示来自 mongo 的 json 数据?

通过 NodeJS 获取 JSON 数据时,如何通过 ExpressJS 更新我的 EJS 模板?

如何在 Blade 模板(Laravel v8)中获取 url 参数