Jade - 模板引擎:如何检查变量是否存在

83

我目前在一个新项目中使用Jade。我想呈现一个页面并检查某个特定变量是否可用。

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!

我总是遇到以下错误:

username is not defined

你有没有任何想法可以解决这个问题?


1
现在看来(2014年),我们不再遇到这个错误了。使用起来更加容易。 - gfaceless
7个回答

108

这应该可以工作:

- if (typeof(username) !== 'undefined'){
  //-do something
-}

如果(isset(username))'isset未定义 - mbecker
2
抱歉,我混淆了PHP和Javascript。我更新了我的答案。 - Chetan
7
非常感谢!这段代码有效:- 如果(typeof username !==“undefined”) - mbecker

94

如果您不介意测试假值而不是未定义的值,则比@Chetan的方法更简单:

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

这是因为有些讽刺意味的叫做locals 的对象是模板的根对象。


这给了我一个编译器错误:'builtin_function_or_method'对象没有属性'username'。 - zakdances
@yourfriendzak - 你确定你的错误是由模板的这部分引起的吗? - BMiner
1
完美运行,比使用内联JavaScript更好,谢谢。 - Sergi Ramón
我喜欢这个答案,因为它表明Jade是一个敏感于空格的语言。 - Victor.Palyvoda
请注意,只有在控制器的render阶段定义了变量才能正常工作:res.render('view', {username: user.name}); - Augustin Riedinger

9
if 'username' in this
    p=username

这有效是因为 res.locals 是模板中的根对象。

6
如果您事先知道想要使用特定的变量,但并非总是使用,我已经开始向helpers对象添加“默认”值。
app.helpers({ username: false });

这样,您仍然可以执行if (username) {而不会发生灾难性的失败。 :)

2
谢谢,不过对于 Express 3.x,现在应该是 app.locals({ username: false }); - 7zark7
6
不错的方法。请注意,在Express 4.x中,app.locals不再是一个函数,所以应该使用app.locals.username = false; - Tom

1
更简单的方式是使用Pug,它是Jade的继任者。
if msg
  p= msg

0

是的,但如果之前用 if 进行了检查,它仍然不应该返回 undefined - JohnAllen

0
创建了一个中间件,使得isDefined方法在我的视图中随处可用:
module.exports = (req, res, next) => {
  res.locals.isDefined = (variable) => {
    return typeof(variable) !== 'undefined'
  };  
  next();
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接