web-dev-qa-db-ja.com

ejsテンプレートでURLパラメータを取得する

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%>のようなものはありますか?

Expressも使用しています。

12
enducat

render()の2番目の引数のオブジェクトとして簡単に渡すことができます

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自体または他の変数が定義されていない場合のようにエラーはスローされません。

13
adeneo
<%= req.query.paramName %>

paramNameがURLクエリパラメータの名前である場合に機能します。

7
mwielbut