File 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);
我检查控制台日志并发现“Creators 2”首先打印
Creators 2: {}
Type: object
Creators: [ { name: 'Jen Smith', _id: 51d3ec2933a3c53c57000001, __v: 0 },
{ name: 'Paul Scholes', _id: 51d3ec3933a3c53c57000002, __v: 0 } ]
似乎Mongoose find()运行asyn ..
分配给数组的问题是我无法将json文档obj转换为回调函数中的数组吗?还有其他方法可以将日期从MongoDb填充到HTML选择标记吗?
答案 0 :(得分:0)
我完全不完全理解你的问题,因为这个问题有很多部分,但似乎你在试图避免异步范式。您可以等待mongoose对象填充,然后再使用模板进行渲染。
您可以在节点
中强制执行异步行为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
稍后,您可以执行Array#map将数组转换为Hash。