Attribut non défini dans le moteur de modèle de jade
Question
J'essaie simplement d'afficher une valeur dans un champ de saisie avec Jade (0,20.3) et Express (2.5.8):
input(name='username', type='text', id="username", value=username)
C'est assez simple, mais cela lance une erreur lorsque la valeur n'est pas définie:
username is not defined
Cependant, la documentation indique:
When a value is undefined or null the attribute is not added, so this is fine, it will not compile 'something="null"'.
Y a-t-il quelque chose que j'aurais mal fait?
La solution
Réponse courte: Utiliser locals.someVar
Si vous n'êtes pas sûr que someVar
existe.
Réponse plus longue:
Je pense que la réponse initiale et le dernier commentaire de Brandon sont corrects (bien que le #{...}
La syntaxe n'est pas nécessaire), mais pour élaborer un peu: il y a une différence entre le passage d'une variable (techniquement, une propriété d'objet) avec une valeur de undefined
, et ne pas passer du tout cette variable.
Parce que Jade transforme votre modèle en source JS et eval
s it (dans le contexte d'un with
Block), vous devez vous assurer que vous ne faites pas référence à des variables qui n'ont pas été transmises, ou elles le seront. Ce billet de blog a un arrière-plan sur les variables non définies vs non déclarées et ReferenceError
.
Votre modèle de jade devrait fonctionner correctement si vous faites une de ces choses:
// ok, even if req.session.username is not defined
res.render('index', { username: req.session.username })
// ditto
res.local('username', req.session.username);
res.render('index')
Mais cela ne fonctionnera pas:
res.locals(req.session) //if no username property exists
res.render('index', { /* no username */ } )
S'il n'est pas pratique de passer manuellement dans chaque paramètre que vous voudrez peut-être vous référer, vous pouvez vous référer à la variable de votre modèle comme propriétés sur le locals
objet (par exemple locals.username
)
Autres conseils
Vous devez vous assurer de passer le nom d'utilisateur dans le modèle de jade. Exemple:
app.get('/', function (req, res) {
res.render('index', { title:'APP NAME', username: req.session.username });
});
De plus, vous l'appelleriez comme ça dans le modèle de jade: #{username}