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も使用しています。
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
自体または他の変数が定義されていない場合のようにエラーはスローされません。
<%= req.query.paramName %>
paramName
がURLクエリパラメータの名前である場合に機能します。