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中很多人的烦恼。

+0

嗨@Steven Schobert,谢谢你的解释!但是为什么没有定义?我传递一个现有的对象,但如果没有,如果/检查 - 它会抛出错误。我真的不明白这种行为背后的逻辑是什么。 – Todo 2014-11-05 21:55:06

+0

你确定它是一个数组每次都被传递吗?尝试在'render'调用之前放置'console.log(all)'。 – 2014-11-05 22:16:04

+0

是的,如果我console.log(全部)就在你的渲染调用之前。 - 史蒂文Schobert 9小时前它是未定义的,但如果我声明:h2 =创造者它呈现/打印整个对象没有问题。但是,如果我想从创建者对象中获取特定的对象 - 它会抛出错误。 P.S你如何突出评论中的代码片段? – Todo 2014-11-06 07:58:07