2013-11-21 6 views
9

Ich versuche, eine ejs-Bedingung basierend auf einem URL-Parameter zu erstellen, zum Beispiel, wenn der Testparameter existiert bei localhost: 3000/page? Test, dann ein div, sonst nicht anzeigen es.Abrufen der URL-Parameter in einer EJS-Vorlage

sieht mein ejs Vorlage so etwas wie:

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

Gibt es eine Möglichkeit, die URL-Parameter direkt von der EJS-Datei zugreifen? Zum Beispiel funktioniert die <% = Titel%> gut, gibt es so etwas wie <% = req.query%>?

Ich benutze auch Express.

Antwort

11

Sie es einfach als ein Objekt in dem zweiten Argument render()

app.get('/someurl', function(req, res, next) { 
    res.render('filename', {query : req.query}); 
}); 

Sie auch die locals Variable

können
app.get('/someurl', function(req, res, next) { 
    res.locals.query = req.query; 
    res.render('filename'); 
}); 

, die sehr nützlich, wenn sie mit einer allgemeinen Route verwendet wird, passieren kann, dass läuft vor allen anderen Routen und macht die Variable in allen folgenden Routen verfügbar

app.use(function(req, res, next) { 
    res.locals.query = req.query; 
    res.locals.url = req.originalUrl; 

    next(); 
}); 

und es ist in der Datei sind Sie als query etc Rendering

<% if (query == "something") { %> 
    <div id="crazy_shit"> 
     <a href="<%- url -%>">Here</a> 
    </div> 
<% } %> 

Als Nebenbemerkung, wenn query aus irgendeinem Grund nicht definiert ist, wird ein Fehler in EJS erhalten für eine nicht definierte Variable, was nervig sein kann.

Normalerweise löse ich dies, indem ich stattdessen ein Objekt verwende, da das Überprüfen von Objekteigenschaften keine Fehler auslöst und es einfach ist sicherzustellen, dass das Objekt immer einen Anfangswert oben in jeder EJS-Vorlage hat.
Es ist wie dies in den Routen

app.user(function(req, res, next) { 
    res.locals.stuff = { 
     query : req.query, 
     url : req.originalUrl 
    } 

    next(); 
}); 

Und dann in der

<% stuff = typeof stuff !== 'object' ? {} : stuff %> 

// later on 

<% if (stuff.query == "something") { %>//does not throw error if property not defined 
    <div id="crazy_shit"></div>   
<% } %> 

Vorlage gemacht, welche auch wenn stuff.query definiert ist, nicht die Bedingung gerade und es einen Fehler nicht werfen, wie es würde wenn stuff selbst oder eine andere Variable nicht definiert wurde.

+1

Sie können auch eine benutzerdefinierte Middleware vor der Routing-Middleware wie folgt haben: 'app.use (Funktion (req, res, next)) {res.locals.some_var = 'var'; next();}); '. Auf diese Weise wird die Variable in allen Ansichten verfügbar sein. Nützlich, um 'req'-Daten wie den URL-Pfad für die Navigation zu übergeben. – diosney

5
<%= req.query.paramName %> 

Werke für mich, wo paramName ist der Name Ihrer URL Abfrageparameter.

+0

Das ist alles was ich brauche. Danke –

+1

zur Zeit funktioniert es nicht ([email protected]) – alfredopacino