Sur la page github EJS, il y a un et un seul exemple simple: https://github.com/visionmedia/ejs
Exemple
<% if (user) { %>
<h2><%= user.name %></h2>
<% } %>
Cela semble vérifier l'existence d'une variable nommée user, et si elle existe, faites certaines choses. Duh, non?
Ma question est, pourquoi dans le monde Node lancerait-il une ReferenceError si la variable utilisateur n'existe pas? Cela rend l'exemple ci-dessus inutile. Quelle est la manière appropriée de vérifier l'existence d'une variable? Dois-je utiliser un mécanisme try / catch et récupérer cette ReferenceError?
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)
Je comprends que je pourrais faire disparaître cette erreur en ajoutant simplement une variable locale "utilisateur" dans mon code serveur, mais le point essentiel ici est que je veux vérifier l'existence de telles variables au moment de l'exécution en utilisant votre tous les jours si / sinon modèle de type nullcheck. Une exception pour une variable qui n'existe pas me semble ridicule.
alert
fait partie d'unwindow
objet de navigateur et n'est pas disponible dans node.js. L'alternative estconsole.log
, même si je ne sais pas si elle est disponible dans un modèle ejs à moins que vous ne la transmettiez vialocals
.if (locals.user){ }
FTWEssayez de faire précéder la variable de
locals
Exemple:
if(locals.user){}
la source
la source
Vous pouvez créer un assistant de vue qui vérifie "obj === void 0", celui-ci est pour express.js:
Ensuite, utilisez-le dans la vue comme
la source
<%=
et<%-
?<%=
HTML échappe d'abord la valeur;<%-
renvoie la valeur non échappée. Donc<b>
deviendrait une balise en gras lors de l'utilisation<%-
, mais simplement le texte "<b>" lors de l'utilisation<%=
Pour vérifier si l'utilisateur est défini, vous devez le faire:
la source
foo
, la clause else est toujours évaluée. Testé avec EJS 2.3.4 EDIT: utilisationlocals
à la place desthis
travauxJ'ai rencontré le même problème en utilisant node.js avec mangouste / express / ejs lors de la création d'une relation entre 2 collections avec populate () de mangouste, dans ce cas admins.user_id existait mais était lié à un user._id inexistant.
Donc, je n'ai pas pu trouver pourquoi:
échouait avec "Impossible de lire la propriété 'nom' de null" Ensuite, j'ai remarqué que je devais faire la vérification comme ceci:
J'avais besoin de vérifier le "conteneur" de 'nom', donc ça a marché!
Après cela, cela a fonctionné de la même manière:
J'espère que ça aide.
la source
Je suis venu sur cette page pour obtenir une réponse, mais j'ai proposé une syntaxe en ligne plus courte, à savoir:
la source
Pour votre
if
relevé, vous devez utilisertypeof
:la source
Ce que je fais, c'est juste passer un objet par défaut que j'appelle 'data' = '' et le passer à tous mes modèles ejs. Si vous avez besoin de transmettre des données réelles au modèle ejs, ajoutez-les en tant que propriété de l'objet 'data'.
De cette façon, l'objet 'data' est toujours défini et vous n'obtenez jamais de message d'erreur indéfini, même si la propriété 'data' existe dans votre modèle ejs mais pas dans votre route express de nœud.
la source
J'ai eu le même problème, et heureusement, j'ai trouvé qu'il y avait aussi une fonction de court-circuit dans JS (je savais qu'il y en avait une en Ruby et dans d'autres langues).
Du côté de mon serveur / contrôleur (cela vient de Node.js / Express):
Regarde ce que j'ai fait là? Le && qui suit une variable éventuellement indéfinie (c'est-à-dire un
request.session.survey_result
objet, qui pourrait ou non avoir des données de forme) est la notation de court-circuit dans JS. Il évalue uniquement la partie qui suit le && si la partie à gauche du && n'est PAS indéfinie. Il ne génère pas non plus d'erreur lorsque la partie gauche ESTundefined
. Il l'ignore tout simplement.Maintenant, dans mon modèle (rappelez-vous que j'ai passé l'objet
req.session.survey_result_survey
objet à ma vue en tant quesurvey_result
), puis j'ai rendu les champs comme:J'ai utilisé le court-circuit là aussi, juste pour la sécurité.
Lorsque je l'ai essayé avec les méthodes suggérées précédemment, il suffit de:
Parfois, il essayait toujours d'évaluer les propriétés dans l'instruction IF ... Peut-être que quelqu'un peut offrir une explication sur pourquoi?
En outre, je voulais corriger cela
undefined
doit être sans les guillemets simples, comme je l'ai vu dans les exemples précédents. Parce que la condition ne sera jamais évaluéetrue
, car vous comparez une valeur String'undefined'
avec un type de donnéesundefined
.la source
Vous pouvez utiliser cette astuce:
où scope est l'objet parent de l'utilisateur
la source
si vous prévoyez d'utiliser souvent le même objet, vous pouvez utiliser une fonction comme celle-ci:
usage:
la source
J'ai trouvé une autre solution.
J'espère que ça aide.
la source