2014-11-05 76 views
1

我正在探索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的文檔中沒有提到應該做出這樣的迭代通過集合之前檢查未定義?

回答

2

在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