玉模板引擎中的未定义属性

时间:2012-02-25 19:27:55

标签: node.js undefined pug

我只是想用Jade(0.20.3)和Express(2.5.8)在输入字段中显示一个值:

input(name='username', type='text', id="username", value=username)

这很简单,但是当值未定义时会抛出错误:

username is not defined

但是,文档指出:

When a value is undefined or null the attribute is not added, so this is fine, it will not compile 'something="null"'.

有什么我会做错的吗?

2 个答案:

答案 0 :(得分:6)

简短回答:如果您不确定locals.someVar是否存在,请使用someVar

更长的答案:

我认为Brandon的初始答案和最后评论是正确的(尽管不需要#{...}语法),但是要详细说明:传入变量之间存在差异(技术上,对象属性) )值为undefined,并且根本不传递该变量。

因为Jade会将您的模板转换为JS源代码并将eval转换为with块(在ReferenceError块的上下文中),您必须确保您没有引用任何避免变量的变量被传入,或者他们将被传入。 This blog post有一些关于未定义与未声明变量和// 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') 的背景信息。

如果您执行以下任一操作,您的Jade模板应该可以正常工作:

res.locals(req.session) //if no username property exists
res.render('index', { /* no username */ } )

但这些不起作用:

locals

如果手动传入您可能想要引用的每个参数是不切实际的,您可以将模板中的变量称为locals.username对象上的属性(例如{{1}})

答案 1 :(得分:1)

您必须确保将用户名传递到Jade模板。例如:

app.get('/', function (req, res) {
    res.render('index', { title:'APP NAME', username: req.session.username });
});

此外,您可以在Jade模板中将其称为:#{username}