2013-07-03 61 views
0

我可以問一個愚蠢的問題嗎?我有一個表單,其中需要有來自MongoDB的數據。首先我嘗試從MongoDB獲取數據(我使用Mongoose),將其保存到數組,然後渲染以查看填充到HTML Select。Express/Mongoose如何將數據填充到HTML選擇標記

文件Task.js

exports.createForm = function (req, res) { 
    var creators = []; 

    CreatorModel.find({}).populate('id name').exec(function(err, crts) { 
    console.log("Creators:", crts); 
    creators = crts; 
    }); 

    res.render('tasks/create-form', { 
    creators: creators 
    }); 
}; 

文件模板

<p> 
    Creator: 
    <select id="creatorlist" name="creator"> 
     {{#each creators}} 
     <option value="{{id}}">{{name}}</option> 
     {{else}} 
     <option value="">No creators</option> 
     {{/each}} 
    </select> 
    <a href="/creator/new">New Creator</a> 
    </p> 

但如果我嵌入渲染功能爲回調,它的工作原理

CreatorModel.find({}, function(err, creators) { 
    AssigneeModel.find({}, function(err, assignees) { 
     res.render('tasks/create-form', { 
     creators: creators, 
     assignees: assignees 
     }); 
    }); 
    }); 

但我覺得這也不行,因爲後來我必須顯示任務ID的確切值,並且很難改善代碼

然後我修改我的代碼在控制檯日誌有點

var creators = {}; 

    CreatorModel.find({}).exec(function(err, crts) { 
    console.log("Type:", typeof(crts)); 

    creators = crts; 
    console.log("Creators:", creators); 
    }); 


    console.log("Creators 2:", creators); 

我檢查,發現「創2」印刷的第一

Creators 2: {} 
Type: object 
Creators: [ { name: 'Jen Smith', _id: 51d3ec2933a3c53c57000001, __v: 0 }, 
    { name: 'Paul Scholes', _id: 51d3ec3933a3c53c57000002, __v: 0 } ] 

看來,貓鼬發現()運行ASYN。 。

與分配給陣列的問題是我不能轉換JSON文件obj轉換爲數組中的回調函數?是否有其他方法來從MongoDb到HTML選擇標記填充日期?

回答

0

我不太完全明白你的問題,因爲這個問題有很多部分,但它好像你正試圖避免異步模式。您可以等待貓鼬對象在使用模板呈現之前進行填充。

您可以在節點上的力異步行爲

https://github.com/caolan/async#parallel

async.parallel([ 
    function(callback){ 
     CreatorModel.find({}).exec(function(err, crts) { 
      creators = crts; 
      callback(creators); 
     }); 
    } ], // optional callback 
    function(err, creators){ 
     res.render('tasks/create-form', { 
      creators: creators, 
      assignees: assignees 
     }); 
    } 

或使用QueryStream管道它後來res.render

http://mongoosejs.com/docs/api.html#querystream_QueryStream

,您可以執行陣列#map將數組轉換爲Hash。

+0

而不是使用'async',爲什麼不叫'res.render()'從回調至'CreatorModel.find()'? – robertklep