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

Javascript 从路由器传递对象/数组时出错,javascript,node.js,express,pug,Javascript,Node.js,Express,Pug,我将Jade作为节点中的视图引擎进行探索,花了3个小时无法将对象(来自数据库的响应)传递到Jade视图而不会出错 从我的路由器all是一个包含对象的数组: var router = express.Router(); router.get('/all', function(req, res){ db.findAll().then(function(all){ res.render("index", { creators: all }); }); }); 玉景:

我将Jade作为节点中的视图引擎进行探索,花了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
直到我最后尝试在creators中的每个el之前检查
if(typeof(creators)!=“undefined”)
,猜猜看。。。魔法发生了。错误消失了


我写这篇文章是为了向所有与同一问题斗争的人提供参考,同时我想问一下这个错误的原因是什么,为什么在Jade的文档中没有提到在遍历集合之前应该检查未定义的内容

在Jade中,在尝试对变量进行操作之前检查变量是否存在是一种常见的模式

从以下内容的Jade文档:

要迭代的对象或数组只是普通的JavaScript,因此它可以是变量、函数调用的结果或几乎任何其他内容


在引擎盖下,Jade正在使用标准JavaScript在您调用
每一个
时进行更新

因此,试图对不存在的东西调用每个,就像试图做:

for(var i=0; i < undefined.length; i++) { ... }
for(var i=0;i
哪些错误是因为
length
不是
undefined
的真实属性


完全理解您的沮丧,因为它处理未定义的数据让很多JavaScript用户感到痛苦。

嘿@Steven Schobert,谢谢您的解释!但是为什么没有定义?我正在传递一个现有对象,但是如果没有if/check,它就会抛出错误。我真的看不出这种行为背后的逻辑。你确定每次都传递一个数组吗?尝试将
console.log(all)
放在
render
调用之前。是的,如果我将console.log(all)放在render调用之前Steven Schobert 9小时前还未定义,但如果我声明:h2=创建者,它将毫无问题地渲染/打印整个对象。但是,如果我想从creators对象获取特定对象,它会抛出错误。你如何在评论中突出显示代码片段?对不起,我不确定我是否理解你的问题。记录时,
all
的值是多少?(对内联代码使用backticks`
for(var i=0; i < undefined.length; i++) { ... }