【问题标题】:Show all of data comming from mongodb and render it in doT.js templating engine显示来自 mongodb 的所有数据并在 doT.js 模板引擎中呈现
【发布时间】:2012-02-12 20:00:53
【问题描述】:

我想从 mongodb 中提取数据并将其传递给视图。一切似乎都有效,但我没有看到所有 10000 条记录,我只看到一条。感觉已经很接近解决了,但是卡住了……我正在使用node-mongodb-native、express和dot.js来实现我的目标。

这是我的 app.js,查找所有操作所在的 app.get():

    /**
 * Mongo DB
 */
var mongodb = require('mongodb'),
    serverdb = new mongodb.Server('127.0.0.1', 27017, {}),
    dbName = new mongodb.Db('test', serverdb, {});
/**
 * Module dependencies.
 */
var express = require('express'),
    doT = require('doT'),
    app = express.createServer(),
    pub = __dirname + '/public',
    view =  __dirname + '/views';

// Configuration
app.configure(function(){
    app.set('views', view);
    app.set('view options', {layout: false});
    app.set('view engine', 'html');
    app.use(app.router);
});

//Simple templating
app.register('.html',doT, {
    compile: function(str, opts){
        return function(locals){
            return str;
        }
    }
});


//----------------- This is where the problem is i think ---------------
app.get('/', function(req, res){
    dbName.open(function (error, client) {
        var collection = new mongodb.Collection(client, 'personnel');
        collection.find().each(function(err, data){
            //Error check
             if (err){return res.end('error!'+err);}
            //Data
             if (data){
                res.render('index.html',{data:data._id});
             } else {
                 res.end();
             }
        });
    });
});
//--------------------------------------------------------------


app.configure('production', function(){
    app.use(express.errorHandler());
});
app.listen(3000);
console.log('Express server listening on port %d in %s mode', app.address().port, app.settings.env);

这是我的html:

<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>Index</title>
</head>
<body>
    {{=it.data}}
</body>
</html>

如果可以,请提供帮助。谢谢。

【问题讨论】:

    标签: javascript node.js mongodb express template-engine


    【解决方案1】:

    我对 dot.js 模板引擎一无所知。但我猜你对 res.render('index.html',{data:data._id}); 的调用会导致页面为光标中的每个元素重新呈现,并且你最终得到页面的最后呈现。

    【讨论】:

    • 是的,这似乎是发生的事情,但这对我来说很难克服。我自然地在 app.js 和视图中尝试了许多可能性。但他们都没有给我正确的结果。还是谢谢。
    【解决方案2】:

    在迭代时,您可以将每个数据存储到数组或链表中。完成数组迭代后,您可以res.render 并将数组或链表传递到视图中。

    【讨论】:

      【解决方案3】:

      好吧,我终于找到了解决方案,首先我必须从 each() 更改为 toArray() ,其中检索我的数据。然后我对我的数据进行字符串化。这不是一个理想的解决方案,因为我只是将所有内容都打印为一个字符串,而不是遍历模板中的数据。我很高兴我正朝着正确的方向前进。

      我的 app.js:

      编辑:找到更好的解决方案。

          //Replace this code with the one in my question to get full file
          //----------------- This is where the problem was ---------------
          app.get('/', function (req, res) {
              dbName.open(function (error, client) {
                  var collection = new mongodb.Collection(client, 'some_collection');
                  collection.find().limit(300).toArray(function (err, dataObjArr) {
                      var data = '';
                      var dataArr = [];
                      var i = dataObjArr.length;
                      //check for error
                      if(err){return res.end('error!'+err);}
                      //Data
                      if (dataObjArr) {
                          while(i--){
                              dataArr[i] = dataObjArr[i]._id;
                          }
                          data = dataArr.join(' ');
                          res.render('index.html', { returnedData : data });
                      }else{
                          res.end();
                      }
                  });
              });
          });
          //--------------------------------------------------------------
      

      我的 index.html:

      <!DOCTYPE html>
      <html>
      <head>
      <meta charset='utf-8'>
      <title>Index</title>
      </head>
      <body>
          {{=it.returnedData}}
      </body>
      </html>
      

      就像我说的,这不是理想的解决方案,但我认为现在我必须让模板引擎本身的高级功能发挥作用。

      【讨论】:

      • @scott-pascoe 谢谢斯科特,我通常在拼写和语法方面更简洁,你所有的编辑都是精确的。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 2014-07-29
      • 2016-06-24
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      相关资源
      最近更新 更多