我正在探索Jade作为Node中的视图引擎,并花了3个小时无法将对象(来自数据库的响应)传递给Jade视图而不会出现错误。
来自我的路由器all
是一个包含对象的数组:
var router = express.Router();
router.get('/all', function(req, res){
db.findAll().then(function(all){
res.render("index", { creators: all });
});
});
玉观点:
doctype html
html
head
title my jade template
body
.comment_list
each el in creators
p= el.creator
如你所见,这很简单。我已经看过20多个使用Jade的例子并且做同样的事情总是得到这个错误:
> TypeError: index.jade:7
5| body
6| .comment_list
> 7| each el in creators
8| p= el.creator
Cannot read property 'length' of undefined
直到我最终尝试在if(typeof(creators) != "undefined")
之前检查each el in creators
并猜测...发生了什么......错误消失了。
我正在写这篇文章,以便参考所有在同一个问题上苦苦挣扎的人,而且我想问一下这个错误的原因是什么,为什么在Jade的文档中没有提到应该进行这样的检查在迭代集合之前未定义?
答案 0 :(得分:2)
在尝试对变量进行操作之前,检查变量的存在是Jade的一种常见模式。
来自iterations上的Jade文档:
要迭代的对象或数组只是普通的JavaScript,因此它可以是变量,也可以是函数调用的结果或几乎任何其他内容。
- var values = [];
ul
each val in values.length ? values : ['There are no values']
li= val
当您调用each
时,Jade正在使用标准JavaScript。
因此,尝试在不存在的内容上调用each
就像尝试一样:
for(var i=0; i < undefined.length; i++) { ... }
由于length
不属于undefined
的不动产而导致哪些错误。
完全理解你的挫败感,因为它处理未定义的数据是很多人在JavaScript中的痛苦。