我正在探索 Jade 作为 Node 中的 View 引擎,花了 3 个小时无法将对象(来自数据库的响应)传递到 Jade View 而不会出错。
从我的路由器 all
是一个包含对象的数组:
var router = express.Router();
router.get('/all', function(req, res){
db.findAll().then(function(all){
res.render("index", { creators: all });
});
});
Jade 观:
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 的文档中没有提到应该进行这样的检查在遍历集合之前是否为 undefined?
最佳答案
在尝试对变量进行操作之前检查变量是否存在是 Jade 中的常见模式。
来自 iterations 上的 Jade 文档:
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
在底层,当您调用 each
时,Jade 使用标准的 JavaScript。
因此尝试在不存在的事物上调用 each
就像尝试做:
for(var i=0; i < undefined.length; i++) { ... }
哪些错误是因为 length
不是 undefined
的真实属性。
完全理解您的沮丧,因为它处理未定义的数据是 JavaScript 中很多人的痛点。
关于javascript - Jade 从路由器传递对象/数组时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26766075/