Auf der EJS-Github-Seite gibt es nur ein einfaches Beispiel: https://github.com/visionmedia/ejs
Beispiel
<% if (user) { %>
<h2><%= user.name %></h2>
<% } %>
Dies scheint die Existenz einer Variablen mit dem Namen user zu überprüfen und, falls vorhanden, einige Dinge zu tun. Duh, richtig?
Meine Frage ist, warum in aller Welt Node einen ReferenceError auslösen würde, wenn die Benutzervariable nicht existiert? Dies macht das obige Beispiel unbrauchbar. Wie kann das Vorhandensein einer Variablen angemessen überprüft werden? Wird von mir erwartet, dass ich einen Try / Catch-Mechanismus verwende und diesen ReferenceError greife?
ReferenceError: user is not defined
at IncomingMessage.anonymous (eval at <anonymous> (/usr/local/lib/node/.npm/ejs/0.3.1/package/lib/ejs.js:140:12))
at IncomingMessage.<anonymous> (/usr/local/lib/node/.npm/ejs/0.3.1/package/lib/ejs.js:142:15)
at Object.render (/usr/local/lib/node/.npm/ejs/0.3.1/package/lib/ejs.js:177:13)
at ServerResponse.render (/usr/local/lib/node/.npm/express/1.0.7/package/lib/express/view.js:334:22)
at Object.<anonymous> (/Users/me/Dropbox/Projects/myproject/server.js:188:9)
at param (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:146:21)
at pass (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:162:10)
at /usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:152:27
at Object.restrict (/Users/me/Dropbox/Projects/myproject/server.js:94:5)
at param (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:146:21)
Ich verstehe, dass ich diesen Fehler beheben könnte, indem ich einfach eine lokale "Benutzer" -Variable in meinen Servercode einfüge, aber der springende Punkt hier ist, dass ich zur Laufzeit überprüfen möchte, ob solche Variablen zur Laufzeit vorhanden sind, indem ich jeden Tag if / else verwende Muster vom Typ nullcheck. Eine Ausnahme für eine Variable, die es nicht gibt, erscheint mir lächerlich.
alert
ist Teil deswindow
Objekts eines Browsers und in node.js nicht verfügbar. Die Alternative istconsole.log
, obwohl ich nicht weiß, ob es in einer ejs-Vorlage verfügbar ist , es sei denn, Sie geben es über weiterlocals
.if (locals.user){ }
FTWVersuchen Sie, die Variable mit voranzustellen
locals
Beispiel:
if(locals.user){}
quelle
quelle
Sie können einen Ansichtshelfer erstellen, der nach "obj === void 0" sucht. Dieser ist für express.js:
Dann benutze es in der Ansicht wie
quelle
<%=
und<%-
?<%=
HTML wird zuerst aus dem Wert entfernt.<%-
gibt den nicht entkoppelten Wert aus. So<b>
würde ein fettgedrucktes Tag bei der Verwendung werden<%-
, aber einfach der Text "<b>" bei der Verwendung<%=
Um zu überprüfen, ob ein Benutzer definiert ist, müssen Sie Folgendes tun:
quelle
foo
, wird die else-Klausel immer noch ausgewertet. Getestet mit EJS 2.3.4 EDIT: Verwendunglocals
anstelle vonthis
ArbeitenIch bin auf dasselbe Problem bei der Verwendung von node.js mit mongoose / express / ejs gestoßen, als ich eine Beziehung zwischen zwei Sammlungen zusammen mit mongoose's populate () herstellte. In diesem Fall existierte admins.user_id, war aber mit einem nicht vorhandenen users._id verwandt.
Also, konnte nicht finden warum:
fehlgeschlagen mit "Kann den Eigenschaftsnamen von null nicht lesen" Dann bemerkte ich, dass ich die Überprüfung wie folgt durchführen musste:
Ich musste den "Container" von "Name" überprüfen, damit es funktionierte!
Danach funktionierte das genauso:
Ich hoffe es hilft.
quelle
Kam auf diese Seite, um eine Antwort zu erhalten, aber ich habe mir eine kürzere Inline-Syntax dafür ausgedacht:
quelle
Für Ihre
if
Aussage müssen Sie verwendentypeof
:quelle
Ich übergebe einfach ein Standardobjekt, das ich 'data' = '' nenne, und übergebe es an alle meine ejs-Vorlagen. Wenn Sie echte Daten an die ejs-Vorlage übergeben müssen, fügen Sie sie als Eigenschaft des 'data'-Objekts hinzu.
Auf diese Weise wird das 'Daten'-Objekt immer definiert und Sie erhalten nie eine undefinierte Fehlermeldung, selbst wenn die Eigenschaft' Daten 'in Ihrer EJS-Vorlage, jedoch nicht in Ihrer Knoten-Express-Route vorhanden ist.
quelle
Ich hatte das gleiche Problem und zum Glück stellte ich fest, dass es in JS auch eine Kurzschlussfunktion gibt (ich wusste, dass es eine in Ruby und einigen anderen Sprachen gibt).
Auf meiner Server- / Controllerseite (dies ist von Node.js / Express):
Siehst du was ich dort gemacht habe? Das &&, das nach einer möglicherweise undefinierten Variablen folgt (dh einem
request.session.survey_result
Objekt, das möglicherweise Formulardaten enthält oder nicht), ist die Kurzschlussnotation in JS. Es wird nur der Teil ausgewertet, der auf das && folgt, wenn der Teil links vom && NICHT undefiniert ist. Es wird auch kein Fehler ausgegeben, wenn der linke Teil IS istundefined
. Es ignoriert es einfach.Nun habe ich in meiner Vorlage (denken Sie daran, dass ich das
req.session.survey_result_survey
Objektobjekt an meine Ansicht übergeben habe alssurvey_result
) Felder gerendert als:Ich habe dort auch Kurzschlüsse verwendet, nur zur sicheren Aufbewahrung.
Als ich es mit zuvor vorgeschlagenen Methoden versuchte, einfach:
Manchmal würde es immer noch versuchen, die Eigenschaften innerhalb der IF-Anweisung zu bewerten ... Vielleicht kann jemand eine Erklärung anbieten, warum?
Außerdem wollte ich korrigieren, dass
undefined
es keine einfachen Anführungszeichen geben muss, wie ich in den vorherigen Beispielen gesehen habe. Da die Bedingung niemals ausgewertet wirdtrue
, wenn Sie einen String-Wert'undefined'
mit einem Datentyp vergleichenundefined
.quelle
Sie können diesen Trick verwenden:
Dabei ist der Bereich das übergeordnete Objekt des Benutzers
quelle
Wenn Sie vorhaben, dasselbe Objekt häufig zu verwenden, können Sie eine Funktion wie die folgende verwenden:
Verwendung:
quelle
Ich habe eine andere Lösung gefunden.
Ich hoffe das hilft.
quelle