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


80

我目前在一个新项目上使用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 2014年

Answers:


105

这应该工作:

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

-如果未定义(isset(username))'isset
mbecker 2011年

2
抱歉,我对PHP和Javascript感到困惑。更新了我的答案。

7
坦克很多!这段代码有效:
-if

93

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

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

之所以可行,locals是因为具有讽刺意味的是模板的根对象。


这给了我一个编译器错误:“builtin_function_or_method”对象有没有属性“用户名”
zakdances

@yourfriendzak-您确定错误是由模板的这一部分引起的吗?
BMiner

1
完美的作品,并且比使用嵌入式javascript更好,谢谢。
瑟吉·拉蒙

我喜欢这个答案,因为这表明Jade是对空格敏感的语言。
Victor.Palyvoda 2014年

请注意,只有在此render阶段在控制器中定义了变量时,此方法才能起作用:res.render('view', {username: user.name});
Augustin Riedinger

10
if 'username' in this
    p=username

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


6

如果您事先知道想要一个特定的变量可用,但并不总是使用它,那么我已经开始向助手对象添加“默认”值。

app.helpers({ username: false });

这样,您仍然if (username) {可以避免灾难性的失败。:)


2
谢谢,尽管FYI for Express 3.x现在是app.locals({ username: false });
7zark7

6
好的方法。请注意,在Express 4.xapp.locals中不再是一个函数,因此应该是app.locals.username = false;
Tom


0

创建了一个中间件以使该方法isDefined在我看来无处不在:

module.exports = (req, res, next) => {
  res.locals.isDefined = (variable) => {
    return typeof(variable) !== 'undefined'
  };  
  next();
};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.