从路由器传递对象/数组时出现错误

时间:2014-11-05 20:05:07

标签: javascript node.js express pug

我正在探索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的文档中没有提到应该进行这样的检查在迭代集合之前未定义?

1 个答案:

答案 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中的痛苦。