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

nic*_*pte 3 undefined node.js pug

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

input(name='username', type='text', id="username", value=username)
Run Code Online (Sandbox Code Playgroud)

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

username is not defined
Run Code Online (Sandbox Code Playgroud)

但是,文档指出:

When a value is undefined or null the attribute is not added, so this is fine, it will not compile 'something="null"'.
Run Code Online (Sandbox Code Playgroud)

有什么我会做错的吗?

小智 6

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

更长的答案:

我认为Brandon的初始答案和最后的评论都是正确的(虽然#{...}不需要语法),但是要详细说明:传递一个变量(技术上,一个对象属性)与值之间存在差异undefined,而不是完全传递该变量.

因为Jade将你的模板转换成JS源代码eval(在with块的上下文中),你必须确保你没有引用任何尚未传入的变量,或者它们将是. 这篇博文有一些关于undefined vs unclared变量的背景知识ReferenceError.

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

// 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')
Run Code Online (Sandbox Code Playgroud)

但这些不起作用:

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

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