Как передать заполненный объект Mongoose в код рендеринга? - PullRequest
5 голосов
/ 04 января 2012

В следующем коде из моего файла rout.js я могу успешно заполнить некоторые ссылки в объекте Mongoose с именем Map. Когда я просматриваю страницу, консоль печатает полностью заполненную версию popmap editor объектов.

  app.get('/map/:id', function(req, res){
    Map
    .findOne({ _id: req.map._id })
    .populate('_editors')
    .run(function (err, popmap) {
      console.log('The editors are %s', popmap._editors);
    });
    res.render('maps/show', {
      title: req.map.title,
      map: req.map
    });
  });

Однако я не понял, как выполнить шаг заполнения, чтобы результирующий объект оставался в области видимости для кода рендеринга. Другими словами, как я могу передать заполненный объект в шаблон Jade вместо простой отправки req.map?

Ответы [ 2 ]

6 голосов
/ 04 января 2012

Проблема в том, что вы пишете код Mongoose, как если бы он был синхронным, но вам нужно вызвать res.render внутри функции обратного вызова run, потому что именно тогда выполняется запрос. В вашем примере функция render будет вызвана до того, как запрос вернет результаты.

Кроме того, вы можете передать переменную popmap как локальную переменную в представление:

app.get('/map/:id', function(req, res){
  Map
  .findOne({ _id: req.map._id })
  .populate('_editors')
  .run(function (err, popmap) {
    console.log('The editors are %s', popmap._editors);
    res.render('maps/show', {
      title: req.map.title,
      map: req.map,
      popmap: popmap // you can access popmap in the view now
    });
  });
});
3 голосов
/ 04 января 2012

Обратите внимание, что задание заполнения является асинхронным, когда задание выполнено, для результата будет вызвана функция обратного вызова. До этого заполненная карта будет недоступна.

Следовательно, вам нужно поместить шаг рендеринга в функцию обратного вызова.

  app.get('/map/:id', function(req, res){
    Map
    .findOne({ _id: req.map._id })
    .populate('_editors')
    .run(function (err, popmap) {
      console.log('The editors are %s', popmap._editors);
      res.render('maps/show', {
        title: popmap.title,
        map: popmap
      });
    });
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...