Muestre todos los datos provenientes de mongodb y represéntelos en el motor de plantillas doT.js

Quería extraer datos de mongodb y pasarlos a la vista. Todo parece funcionar, pero en lugar de ver aparecer todos los 10000 registros, solo veo uno. Siento que estoy muy cerca de resolverlo, pero me quedé atascado … Estoy usando node-mongodb-native, express y dot.js para lograr mi objective.

Aquí está mi app.js, busque el app.get () que es donde toda la acción es:

/** * 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); 

Y aquí está mi html:

     Index   {{=it.data}}   

Por favor ayuda si puedes. Gracias.

No sé nada sobre dot.js motor de plantillas. Pero supongo que su llamada a res.render('index.html',{data:data._id}); hace que la página se vuelva a representar para cada elemento en el cursor y termine con la última representación de la página.

Mientras realiza la iteración, puede almacenar cada dato en una matriz o lista enlazada. Después de finalizar la iteración de la matriz, puede res.render y pasar la matriz o la lista enlazada a la vista.

Bueno, finalmente encontré una solución, primero tuve que cambiar de each() a toArray() donde se recuperan mis datos. Entonces me encadené a mis datos. No es una solución ideal, ya que solo imprimo todo como una cadena en lugar de iterar a través de los datos en la plantilla. Me alegro de que me estoy moviendo en la dirección correcta.

Mi app.js:

EDIT : encontré una solución aún mejor.

  //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(); } }); }); }); //-------------------------------------------------------------- 

mi index.html:

     Index   {{=it.returnedData}}   

Como dije, no es la solución ideal, pero creo que ahora tengo que poner en funcionamiento las funciones avanzadas del propio motor de plantillas.