【问题标题】:How Express/Mongoose populate data to HTML select tagExpress/Mongoose 如何将数据填充到 HTML 选择标签
【发布时间】:2013-07-04 07:16:55
【问题描述】:

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

文件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() 似乎是异步运行的。

分配给数组的问题是我无法在回调函数中将 json 文档 obj 转换为数组?还有其他方法可以将日期从 MongoDb 填充到 HTML Select Tag 吗?

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    我不太明白你的问题,因为这个问题有很多部分,但似乎你试图避免异步范式。您可以等待 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。

    【讨论】:

    • 不使用async,为什么不直接从回调中调用res.render()CreatorModel.find()
    猜你喜欢
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多