【问题标题】:Displaying data from a Mongodb collection in ejs using Mongoose使用 Mongoose 在 ejs 中显示来自 Mongodb 集合的数据
【发布时间】:2018-03-15 20:52:07
【问题描述】:

我是编程新手。我的本地数据库中有一个名为“Practice”的集合,其中包含“名称、角色、组织”。我正在尝试弄清楚如何使用 mongoose 在 .ejs 文件中打印此信息。

在我的 server.js 中,我有

require('./app/routes.js')(app, passport);     
mongoose.connect(configDB.url); // connect to our database
    var schema = mongoose.Schema;
    mongoose.model('practice', new schema({ Name: String, Role: String, Org: String}),'practice');
    var practice = mongoose.model('practice');
    practice.find({}, function(err, data) { console.log(err, data); });

在路线中,

app.get('/profileface', isLoggedIn, function(req, res) {
        res.render('profileface.ejs', {
            user : req.user
        });
    });

在视图文件夹中,文件 profileface.ejs,我有下面的打印我的“练习”集合中的名称。

<%= practice.name %>

虽然它是在控制台打印,但当我尝试访问 profileface.ejs 时,出现以下错误。

ReferenceError: C:\Users\SEESCHU\Desktop\Linneus university\Assignments\302\Assignment 2\code\Test3\views\profileface.ejs:36 34| </div> 35| >> 36| <%= practice.name %> 37| 38| <!-- <div class="text-center"> 39| <p>Assignment for 4ME302</p> practice is not defined at eval (eval at <anonymous> (C:\Users\SEESCHU\Desktop\Linneus university\Assignments\302\Assignment 2\code\Test3\node_modules\ejs\lib\ejs.js:237:14), <anonymous>:30:986) at eval (eval at <anonymous> (C:\Users\SEESCHU\Desktop\Linneus university\Assignments\302\Assignment 2\code\Test3\node_modules\ejs\lib\ejs.js:237:14), <anonymous>:30:1154) at C:\Users\SEESCHU\Desktop\Linneus university\Assignments\302\Assignment 2\code\Test3\node_modules\ejs\lib\ejs.js:250:15 at Object.exports.render (C:\Users\SEESCHU\Desktop\Linneus university\Assignments\302\Assignment 2\code\Test3\node_modules\ejs\lib\ejs.js:288:13) at View.exports.renderFile [as engine] (C:\Users\SEESCHU\Desktop\Linneus university\Assignments\302\Assignment 2\code\Test3\node_modules\ejs\lib\ejs.js:318:20) at View.render (C:\Users\SEESCHU\Desktop\Linneus university\Assignments\302\Assignment 2\code\Test3\node_modules\express\lib\view.js:76:8) at Function.app.render (C:\Users\SEESCHU\Desktop\Linneus university\Assignments\302\Assignment 2\code\Test3\node_modules\express\lib\application.js:504:10) at ServerResponse.res.render (C:\Users\SEESCHU\Desktop\Linneus university\Assignments\302\Assignment 2\code\Test3\node_modules\express\lib\response.js:798:7) at C:\Users\SEESCHU\Desktop\Linneus university\Assignments\302\Assignment 2\code\Test3\app\routes.js:30:7 at callbacks (C:\Users\SEESCHU\Desktop\Linneus university\Assignments\302\Assignment 2\code\Test3\node_modules\express\lib\router\index.js:164:37) at isLoggedIn (C:\Users\SEESCHU\Desktop\Linneus university\Assignments\302\Assignment 2\code\Test3\app\routes.js:116:10) at callbacks (C:\Users\SEESCHU\Desktop\Linneus university\Assignments\302\Assignment 2\code\Test3\node_modules\express\lib\router\index.js:164:37) at param (C:\Users\SEESCHU\Desktop\Linneus university\Assignments\302\Assignment 2\code\Test3\node_modules\express\lib\router\index.js:138:11) at pass (C:\Users\SEESCHU\Desktop\Linneus university\Assignments\302\Assignment 2\code\Test3\node_modules\express\lib\router\index.js:145:5) at Router._dispatch (C:\Users\SEESCHU\Desktop\Linneus university\Assignments\302\Assignment 2\code\Test3\node_modules\express\lib\router\index.js:173:5) at Object.router (C:\Users\SEESCHU\Desktop\Linneus university\Assignments\302\Assignment 2\code\Test3\node_modules\express\lib\router\index.js:33:10)

过去 2 天我一直试图通过谷歌搜索来解决这个问题,但现在我放弃了。如果您能帮助我,我将不胜感激。

【问题讨论】:

    标签: node.js mongodb mongoose ejs


    【解决方案1】:

    您好,我遇到了同样的问题,所以我做了这个,它成功了

    collection(users).find({}, (err, found) => {
     if(err){
     console.log(err)
     }else{
     res.render("Dashboard", {DataFound: found})
     }
    })
    

    【讨论】:

      【解决方案2】:

      额外在编程中,您希望保持代码井井有条。

      创建一个文件,例如PracticeModel.jsapp 文件夹中并将您的架构逻辑移到那里

      var PracticeSchema = new mongoose.Schema({ 
          Name: String, 
          Role: String, 
          Org: String
      });
      
      module.exports = mongoose.model('practice', PracticeSchema, 'practice');
      

      在您的 routes.js 中,在顶部包含新创建的文件

      var PracticeModel = require('./PracticeModel.js');
      

      您的问题您需要 (1) 将查询移动到路由处理程序中并 (2) 将结果集 data 传递给视图

      app.get('/profileface', isLoggedIn, function(req, res) {
          // mongoose operations are asynchronous, so you need to wait 
          PracticeModel.find({}, function(err, data) {
              // note that data is an array of objects, not a single object!
              res.render('profileface.ejs', {
                  user : req.user,
                  practices: data
              });
          });
      });
      

      在您的视图 profileface.ejs 中,您需要遍历传递的 practices 数组

      <% practices.forEach(function (practice) { %>
          <%= practice.Name %> <!-- note you defined the field as Name not name -->
      <% }) %>
      

      您的 server.js 在更改后将如下所示

      mongoose.connect(configDB.url);
      require('./app/routes.js')(app, passport);     
      

      synchronous vs asynchronous 上阅读这篇文章。您在 Node.js 中所做的大部分事情通常都是异步的。

      【讨论】:

      • 我不知道该怎么感谢你。这是我连续第三个晚上试图弄清楚。成功了。
      • 真的很感谢你,你的解释很有用。祝您新年快乐!
      猜你喜欢
      • 2016-03-23
      • 1970-01-01
      • 2019-10-12
      • 2020-07-09
      • 1970-01-01
      • 2019-08-20
      • 2017-05-03
      • 2021-11-03
      • 2016-07-11
      相关资源
      最近更新 更多