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的痛苦的人很多。