Express / Mongoose如何将数据填充到HTML选择标记

时间:2013-07-03 10:54:53

标签: node.js mongodb express mongoose

我可以问一个愚蠢的问题吗?我有一个表单,其中包含需要从MongoDB获取数据的选择列表。首先,我尝试从MongoDB获取数据(我使用Mongoose),将其保存到数组,然后渲染以查看以填充到HTML Select。

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选择标记吗?

1 个答案:

答案 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。