2016-02-28 76 views
0

嘗試切換Mongo並放入Postgres(換句話說,類似的代碼可以在Mongo中正常工作)。在以下代碼上獲取Cannot read property 'length' of undefined。我相信這很簡單,但我對整個堆棧很陌生,所以無法將它捆綁在一起。沒有很多關於knex的例子,所以即使這些文檔非常好,我仍然無法找到要複製的例子。Knex/Jade:無法讀取未定義的屬性「長度」

我很明顯地在提取正確的數據,但我一直在堅持如何讓玉石來展示它。

堆棧:節點/快速/ Knex/Postgres的/玉

users.js

router.get('/', function(req, res, next) { 
    db.select().from('users').limit(1) 
    .then(function(users) { 
     console.dir(users)}) 
    .then(function(users) { 
     res.render('users', {users: users})}) 
    .catch(function(error) { 
     console.error(error) 
    }) 
}); 

users.jade

extends layout 

block content 
    h1 Users 
    ul 
    for user in users 
     p 
     input(type="text", name="name", value="#{user.name}") 
     input(type="text", name="admin", value="#{user.admin}") 
     input(type="text", name="smsNumber", value="#{user.smsNumber}") 

控制檯

[ { uid: 1, 
    name: 'Don', 
    admin: 'true', 
    smsNumber: '4077023951', 
    created_at: null, 
    updated_at: null } ] 

瀏覽器在本地主機:3000 /用戶

C:\Users\dvande03\Personal\dailychallenge\views\users.jade:6 4| h1 Users 5| ul > 6| for user in users 7| p 8| input(type="text", name="name", value="#{user.name}") 9| input(type="text", name="admin", value="#{user.admin}") Cannot read property 'length' of undefined 

TypeError: C:\Users\dvande03\Personal\dailychallenge\views\users.jade:6 
    4| h1 Users 
    5| ul 
    > 6|  for user in users 
    7|  p 
    8|   input(type="text", name="name", value="#{user.name}") 
    9|   input(type="text", name="admin", value="#{user.admin}") 

Cannot read property 'length' of undefined 
    at eval (eval at <anonymous> (C:\Users\dvande03\Personal\dailychallenge\node_modules\jade\lib\index.js:218:8), <anonymous>:51:31) 
    at eval (eval at <anonymous> (C:\Users\dvande03\Personal\dailychallenge\node_modules\jade\lib\index.js:218:8), <anonymous>:106:4) 
    at eval (eval at <anonymous> (C:\Users\dvande03\Personal\dailychallenge\node_modules\jade\lib\index.js:218:8), <anonymous>:119:22) 
    at res (C:\Users\dvande03\Personal\dailychallenge\node_modules\jade\lib\index.js:219:38) 
    at Object.exports.renderFile (C:\Users\dvande03\Personal\dailychallenge\node_modules\jade\lib\index.js:380:38) 
    at Object.exports.renderFile (C:\Users\dvande03\Personal\dailychallenge\node_modules\jade\lib\index.js:370:21) 
    at View.exports.__express [as engine] (C:\Users\dvande03\Personal\dailychallenge\node_modules\jade\lib\index.js:417:11) 
    at View.render (C:\Users\dvande03\Personal\dailychallenge\node_modules\express\lib\view.js:126:8) 
    at tryRender (C:\Users\dvande03\Personal\dailychallenge\node_modules\express\lib\application.js:639:10) 
    at EventEmitter.render (C:\Users\dvande03\Personal\dailychallenge\node_modules\express\lib\application.js:591:3) 
    at ServerResponse.render (C:\Users\dvande03\Personal\dailychallenge\node_modules\express\lib\response.js:961:7) 
    at C:\Users\dvande03\Personal\dailychallenge\routes\users.js:11:13 
    at tryCatcher (C:\Users\dvande03\Personal\dailychallenge\node_modules\bluebird\js\main\util.js:24:31) 
    at Promise._settlePromiseFromHandler (C:\Users\dvande03\Personal\dailychallenge\node_modules\bluebird\js\main\promise.js:454:31) 
    at Promise._settlePromiseAt (C:\Users\dvande03\Personal\dailychallenge\node_modules\bluebird\js\main\promise.js:530:18) 
    at Promise._settlePromises (C:\Users\dvande03\Personal\dailychallenge\node_modules\bluebird\js\main\promise.js:646:14) 

回答

0

res.render應該是這樣的:res.render(view [, locals] [, callback]),其中locals是一個對象,其屬性定義的視圖的局部變量。 在你的情況這意味着改變,你渲染線:

res.render('users', {users: users}) 

您通過與本地變量渲染的對象。在你想引用這些值時,你可以在對象中使用對象中的鍵。

+0

我準備好慶祝並取得進展,因爲這是我的一個明顯的疏忽,我確信它是正確的。感謝您花時間詳細解釋爲什麼應該起作用。 不幸的是,它沒有。我編輯了上面的原始users.js代碼以反映更改並添加了瀏覽器輸出。它與原始輸出相同,但我認爲它需要包括在內。 – caelon

0

解決了它,但我不完全明白爲什麼。我在渲染之前將console.dir註釋掉了,它可以工作。那是因爲console.dir .then中的用戶沒有傳遞給渲染.then

我也接受了上面的答案,因爲沒有這個,我不能在這裏得到。謝謝@tomtom。

+0

我不確定,但是我的理解是與鏈接。然後是你必須在鏈的每個部分返回一些東西。那麼如果你返回用戶會發生什麼;你的console.dir後? – tomtom

+0

就是這樣,@tomtom。你必須傳遞一些東西到'.then'的每個部分。謝謝你的幫助。 – caelon

相關問題