web-dev-qa-db-fra.com

Comment vérifieriez-vous une propriété non définie dans ejs pour node.js?

Quelle est la meilleure façon de vérifier une propriété non définie dans un modèle ejs?

(J'utilise le package node.js par TJ Holowaychuk)

Exemple:

var tpl = '<% if (foo) { %>foo defined<% } else { %>foo undefined<% } %>';
console.log(ejs.render(tpl, { locals: { bar: "baz" } }));

Je m'attendrais à ce que cela rende "foo indéfini". Il lance à la place une erreur foo undefined .

Je sais que ce n'est pas censé être un problème, car c'est un comportement attendu dans les tests . Existe-t-il un moyen simple d'éviter cela?

La seule solution que j'ai trouvée utilise la méthode hasOwnProperty.

var tpl = '<% if (hasOwnProperty("foo")) { %>foo defined<% } else { %>foo undefined<% } %>';
console.log(ejs.render(tpl, { locals: { bar: "baz"} }));

Cela ne génère aucune erreur.

Existe-t-il une meilleure façon de garder le modèle propre? Ou pourquoi jette-t-il cette erreur?

34
pvorb

Une autre façon de tester une propriété consiste à la référencer indirectement via l'objet locals. En utilisant votre exemple:

var tpl = '<% if(locals.foo){ %>foo defined<% }else{ %>foo undefined<% } %>';
console.log(ejs.render(tpl, { locals: { bar: "baz"} }));
62
Richard Marr

J'utiliserais typeof, comme dans if (typeof foo == 'undefined'). J'utilise l'opérateur typeof avec la chaîne "undefined", alors que certaines personnes pourraient faire une comparaison directe avec la variable globale undefined. Je préfère cette méthode car elle est protégée contre certains développeurs de bibliothèques JS terroristes qui modifient la valeur de la variable globale, laissant votre code cassé.

Cela pourrait également être exprimé comme un ternaire, que certains considèrent comme "plus propre" en raison de l'absence de curlies:

var tpl = '<% (typeof foo != "undefined" ? %>foo defined<% : %>foo undefined<% ) %>';
19
Chris Baker

Le plus simple et le plus propre à mon avis:

<%= (!!locals.foo)?foo:'' %>

10
rob_james