Нет вывода HTML с использованием Express для вывода результатов MongoDB - PullRequest
4 голосов
/ 16 марта 2019

Я делаю первый проект node / express / mongo / handlebars и борюсь со стороной вывода HTML.У меня это работало ненадолго, но что-то сломалось, когда я разрабатывал код.

Я не уверен, что я просто провалил свой первоначальный вывод и ищу совет о том, как наилучшим образом решить проблему или это простая ошибка,Я добавил запись в Mongo без проблем, и данные в порядке, но я не могу последовательно выводить результаты.

router.get('/:chanName', function(req, res, next) {
  if (req.params.chanName != 'add') {
   let myData = {};  

    MongoClient.connect(url, { useNewUrlParser: true }, (err, client) => {
      if (err) { return console.log('Unable to connect to MongoDB'); } 

      //get result from db     
      client.db('tube').collection('channel-reviews').find({'channel': req.params.chanName}).toArray(function(err, result) {
        if (err) throw err;
        
        myData = result[0];
        // myData is populated object here     
      });
        // myData is empty object here
      client.close();  
      res.render('review');

    });
      
  } else {
    res.render('add');
  }
});

URL-адрес используется в качестве параметра для получения записи монго, которую я затем пытаюсь представить в виде списка со следующим шаблоном

<ul>
    <li>{{ myData.channel }}</li>
    <li>{{ myData.chanURL }}</li>
    <li>{{ myData.score }}</li>
    <li>{{ myData.title }}</li>
    <li>{{ myData.content }}</li>
</ul>

Я просто положил что-то не туда или это что-то более фундаментальное (например, окончательный код выполняется задолго до того, как данные могут быть получены и обработаны) и требует использования Promisesи т. д.

1 Ответ

7 голосов
/ 16 марта 2019

Как упоминалось в https://expressjs.com/en/api.html#res.render функция res.render () принимает локальные переменные для представления в качестве второго параметра, поэтому вам необходимо передать объект в функцию res.render ()

Goingпо шаблону вызов функции будет выглядеть так:

res.render('review',{myData:myData});

Это должно нормально работать с вашим шаблоном, если объект mydata имеет все эти свойства (канал и т. д.).Также убедитесь, что эта функция вызывается только в функции обратного вызова, в том месте, где вы говорите, что объект правильно заполнен.

Sidenote: я бы предпочел следующий код просто для создания шаблонапоявляются аккуратнее

res.render('review',{channel:mydata.channel,chanURL:mydata.chanURL,score:mydata.score,title:mydata.title,content:mydata.content});

и шаблон как

<ul>
    <li>{{ channel }}</li>
    <li>{{ chanURL }}</li>
    <li>{{ score }}</li>
    <li>{{ title }}</li>
    <li>{{ content }}</li>
</ul>

...