Jade从路由器传递对象/数组时遇到错误

我正在探索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 

直到我终于在each el in creators之前尝试检查if(typeof(creators) != "undefined") ,并猜测发生了什么……魔法。 错误消失了。

我正在写这篇文章,以供所有人在同样的问题上挣扎,同时我想问一下这个错误的原因是什么,为什么在Jade的文档中没有提到应该做一个未定义的检查迭代通过集合?

Jade中常见的模式是在对它进行操作之前检查variables的存在。

从迭代的Jade文档:

要迭代的对象或数组只是普通的JavaScript,所以它可以是一个variables或函数调用的结果或几乎其他任何东西。

 - var values = []; ul each val in values.length ? values : ['There are no values'] li= val 

在引擎盖下,Jade使用标准的JavaScript来调用each

所以试图调用each不存在的东西就像试图做:

 for(var i=0; i < undefined.length; i++) { ... } 

哪个错误是因为length不是undefined的真实属性。

完全理解你的挫败感,因为它处理未定义的数据是JavaScript的痛苦的人很多。