143 votes

Quel est le moyen approprié de vérifier l'existence d'une variable dans un modèle EJS (à l'aide d'ExpressJS)?

Sur l'EJS github page, il y en a un, et seulement un exemple simple: https://github.com/visionmedia/ejs

Exemple

<% if (user) { %>
    <h2><%= user.name %></h2>
<% } %>

Cela semble être de vérifier l'existence d'une variable d'utilisateur nommé, et si elle existe, de faire quelques trucs. Bah, non?

Ma question est, pourquoi dans le monde serait Nœud de jeter un ReferenceError si la variable n'existe pas? Cela rend l'exemple ci-dessus inutiles. Quel est le moyen le plus approprié pour vérifier l'existence d'une variable? Suis-je censé utiliser un try/catch mécanisme et de saisir que 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 j'ai pu faire cette erreur d'aller loin en ajoutant simplement un "utilisateur" variable locale dans mon code serveur, mais le point ici est que je veux vérifier l'existence de ces variables lors de l'exécution à l'aide de votre chaque jour si/d'autre nullcheck type de modèle. Une exception pour une variable qui n'existe pas semble ridicule pour moi.

183voto

tjholowaychuk Points 1320

Comment faire avec n'importe quoi dans js, typeof foo == 'undefined' , ou puisque "locals" est le nom de l'objet qui les contient, vous pouvez faire if (locals.foo) . C'est juste brut js: p

14voto

Paulius Uza Points 146

Vous pouvez créer un assistant de vue qui recherche "obj === void 0", celui-ci concerne express.js:

 res.locals.get = function() {
    var args = Array.prototype.slice.call(arguments, 0);
    var path = args[0].split('.');
    var root = this;
    for (var i = 0; i < path.length; i++) {
        if(root[path[i]] === void 0) {
            return args[1]?args[1]:null;
        } else {
            root = root[path[i]];
        }
    };
    return root;
}
 

Puis utilisez-le dans la vue comme

 <%- get('deep.nested.non.existent.value') %>  //returns: null
<%- get('deep.nested.non.existent.value', "default value") %> //returns: default value
 

12voto

HenioJR Points 76

Pour vérifier si l'utilisateur est défini, vous devez le faire:

 <% if (this.user) { %>
   here, user is defined
<% } %>
 

9voto

aesede Points 97

J'ai rencontré le même problème à l'aide de node.js avec la mangouste/express/ejs lors d'un rapport entre les 2 collections en collaboration avec la mangouste de remplir(), dans ce cas les admins.user_id existait mais était lié à un inexistante utilisateurs._id.
Donc, impossible de trouver pourquoi:

if ( typeof users.user_id.name == 'undefined' ) ...

n'était pas avec "Impossible de lire la propriété 'name', null" Ensuite, j'ai remarqué que j'avais besoin de faire la vérification comme ceci:

if ( typeof users.user_id == 'undefined' ) ...

J'avais besoin de vérifier le "contenant" de "nom", de sorte qu'il fonctionne!
Après cela, il a travaillé le même:

if ( !users.user_id ) ...  

Espérons que cela aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X