Показать все данные, поступающие из mongodb, и отобразить их в шаблонизаторе doT.js.

Я хотел извлечь данные из 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>

Пожалуйста, помоги, если можешь. Спасибо.


person user    schedule 12.02.2012    source источник


Ответы (3)


Я ничего не знаю о шаблонизаторе dot.js. Но я предполагаю, что ваш вызов res.render('index.html',{data:data._id}); приводит к повторному рендерингу страницы для каждого элемента в курсоре, и вы получаете последний рендеринг страницы.

person 271828183    schedule 12.02.2012
comment
Да, это то, что, кажется, происходит, но это то, что мне трудно преодолеть. Я пробовал много возможностей, естественно, как в app.js, так и в представлении. Но ни один из них не дал мне нужных результатов. Спасибо, в любом случае. - person user; 13.02.2012

Во время итерации вы можете сохранять все данные в массив или связанный список. После завершения итерации массива вы можете res.render передать массив или связанный список в представление.

person user482594    schedule 12.02.2012

Что ж, я наконец нашел решение, сначала мне пришлось изменить each() на toArray(), где извлекаются мои данные. затем я упорядочил свои данные. Это не идеальное решение, так как я просто распечатываю все как одну строку, а не перебираю данные в шаблоне. Я просто рад, что двигаюсь в правильном направлении.

Мой app.js:

EDIT: найдено еще лучшее решение.

    //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>

Как я уже сказал, это не идеальное решение, но я думаю, что теперь я должен заставить работать расширенные функции самого механизма шаблонов.

person user    schedule 29.06.2012
comment
@ scott-pascoe Спасибо, Скотт, я обычно более лаконичен, когда дело касается орфографии и грамматики, все ваши правки точны. Спасибо. - person user; 15.11.2012