0

バカな質問してもいいですか?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 に日付を入力する他の方法はありますか?

4

1 に答える 1

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 を実行して、配列をハッシュに変換できます。

于 2013-07-03T23:11:11.760 に答える