Jade - Motor de plantillas: Cómo comprobar si existe una variable

80

Actualmente estoy usando Jade en un nuevo proyecto. Quiero renderizar una página y verificar si una determinada variable está disponible.

app.js:

app.get('/register', function(req, res){
    res.render('register', {
        locals: {
          title: 'Register',
          text: 'Register as a user.',
        }
      });
});

register.jade:

- if (username)
p= username
- else
p No Username!

Siempre obtengo el siguiente error:

username is not defined

¿Alguna idea sobre cómo puedo solucionar esto?

mbecker
fuente
1
Parece que a estas alturas (2014), ya no recibimos este error. Mucho más fácil de usar.
gfaceless

Respuestas:

105

Esto debería funcionar:

- if (typeof(username) !== 'undefined'){
  //-do something
-}
Chetan
fuente
- si (isset (nombre de usuario)) 'isset no está definido
mbecker
2
Lo siento, me confundí con PHP y Javascript. Actualicé mi respuesta.
Chetan
7
¡Muchas gracias! Este código funciona: - if (typeof username! == "undefined")
mbecker
93

Más simple que el método de @ Chetan si no le importa probar valores falsos en lugar de valores indefinidos:

if locals.username
  p= username
else
  p No Username!

Esto funciona porque el nombre un tanto irónico localses el objeto raíz de la plantilla.

BMiner
fuente
Esto me da un error del compilador: el objeto 'builtin_function_or_method' no tiene atributo 'username'
zakdances
@yourfriendzak: ¿está seguro de que su error se debe a esta parte de su plantilla?
BMiner
1
Funciona perfectamente y es mejor que usar JavaScript en línea, gracias.
Sergi Ramón
Me gusta esta respuesta porque muestra que Jade es un lenguaje sensible a los espacios en blanco.
Victor.Palyvoda
Cuidado, esto solo funcionará si la variable se definió en el controlador en la renderetapa:res.render('view', {username: user.name});
Augustin Riedinger
10
if 'username' in this
    p=username

Esto funciona porque res.locals es el objeto raíz de la plantilla.

evitar3d
fuente
6

Si sabe de antemano que desea que una variable en particular esté disponible, pero no siempre se usa, comencé a agregar un valor "predeterminado" al objeto de ayuda.

app.helpers({ username: false });

De esta manera, aún puede if (username) {prescindir de una falla catastrófica. :)

Dominic Barnes
fuente
2
Gracias, aunque para su información por Express 3.x, esto es ahoraapp.locals({ username: false });
7zark7
6
Buen enfoque. Tenga en cuenta que en Express 4.x app.localsya no es una función, por lo que debería serloapp.locals.username = false;
Tom
0

Creé un middleware para tener el método isDefineddisponible en todas partes en mis vistas:

module.exports = (req, res, next) => {
  res.locals.isDefined = (variable) => {
    return typeof(variable) !== 'undefined'
  };  
  next();
};
Augustin Riedinger
fuente