javascript - Jade 从路由器传递对象/数组时出错

标签 javascript node.js express pug

我正在探索 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/

相关文章:

node.js - 将大量 csv 行导入数据库而不会耗尽内存

javascript - 在 vm 脚本上下文中传递函数

node.js - 在express.js应用程序中组织游戏

node.js - Res.send() 之后的 ExpressJS 4 执行函数

javascript - 使用Mapbox从Terrain图层切换到Satellite图层

Javascript date.setFullYear 更改 FF 和 Safari 中的日期

javascript - Webpack 4 配置入口点和输出(每个项目文件夹中生成的 dist 文件夹)

javascript - jquery 自动提交自身

javascript - 在 iOS 移动浏览器中请求位置权限弹出窗口

javascript - 为什么mysql查询 "select count(*) from table"返回 "[object Object]"作为结果?