Jade从路由器传递对象/数组时得到错误
问题描述:
我正在探索Jade作为Node中的视图引擎,并花了3个小时无法将对象(来自数据库的响应)传递给Jade视图而没有出现错误。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多个例子,做同样的,总是出现此错误:
> 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中尝试操作它之前,检查变量的存在是一种常见模式。
从玉石文档上iterations:
The object or array to iterate over is just plain JavaScript so it can be a variable or the result of a function call or almost anything else.
- var values = [];
ul
each val in values.length ? values : ['There are no values']
li= val
引擎盖下,翡翠是用标准的JavaScript当你打电话给each
。
所以试图调用each
的东西,不存在就像是试图做:
for(var i=0; i < undefined.length; i++) { ... }
哪些错误,因为length
不是undefined
不动产。
完全理解你的挫败感,因为它处理未定义的数据是JavaScript中很多人的烦恼。
嗨@Steven Schobert,谢谢你的解释!但是为什么没有定义?我传递一个现有的对象,但如果没有,如果/检查 - 它会抛出错误。我真的不明白这种行为背后的逻辑是什么。 – Todo 2014-11-05 21:55:06
你确定它是一个数组每次都被传递吗?尝试在'render'调用之前放置'console.log(all)'。 – 2014-11-05 22:16:04
是的,如果我console.log(全部)就在你的渲染调用之前。 - 史蒂文Schobert 9小时前它是未定义的,但如果我声明:h2 =创造者它呈现/打印整个对象没有问题。但是,如果我想从创建者对象中获取特定的对象 - 它会抛出错误。 P.S你如何突出评论中的代码片段? – Todo 2014-11-06 07:58:07