使用Express不输出HTML以输出MongoDB结果

时间:2019-03-16 14:42:20

标签: javascript node.js express ejs

我正在制作第一个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等?

1 个答案:

答案 0 :(得分:7)

https://expressjs.com/en/api.html#res.render所述 res.render()函数将视图的局部变量作为第二个参数,因此您需要将对象传递给函数res.render()

按照模板操作,函数调用就像

sap.ui.define([
    "sap/ui/core/UIComponent",
    "sap/ui/model/json/JSONModel",
    "tmp/Zprojetyoussra/controller/Dialog"    ,
    "sap/ui/Device"
], function (UIComponent, JSONModel, Dialog, Device) {
    "use strict";

    return UIComponent.extend("tmp.Zprojetyoussra.Component", {
        metadata: {
    //        rootView: "tmp.Zprojetyoussra.view.tesstview"
            manifest: "json"
        },

如果mydata对象具有所有这些属性(通道等),则此方法对您的模板应该可以正常工作。另外,请确保仅在回调函数中正确填充对象的位置调用该函数。

旁注: 我希望下面的代码只是为了使模板看起来更整洁

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

,模板为

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