使用Express输出MongoDB结果时没有HTML输出

4

我正在制作一个使用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被用作参数来检索一个Mongo条目,我正在尝试使用以下模板将其呈现为列表。

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

我是不是把某些东西放错了地方,或者是更根本的问题(例如最终代码在数据可以被检索和处理之前很长时间就执行了),需要使用Promises等解决方案?


你使用的模板引擎是哪个?我猜是 ejs,对吗? - Ravi Shankar Bharti
使用的模板引擎是Handlebars。 - devolved
1个回答

7

如在https://expressjs.com/zh/api.html#res.render中所提到的, res.render()函数把用于视图的本地变量作为其第二个参数,因此您需要将对象传递给函数res.render()。

根据模板,该函数调用应该是:

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

只要mydata对象有所有这些属性(channel等),这个功能就应该可以与您的模板很好地配合使用。同时确保仅在回调函数中调用此函数,在您说对象已经正确填充的那一点调用。

附带说明: 为了使模板看起来更加整洁,我更喜欢以下代码

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>


非常感谢,我已经将它变成了一个正式的Git存储库,这样我就可以回滚并避免将来出现类似的错误。 - devolved

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接