2016-01-02 3 views
1

У меня есть простое приложение, которое использует Express и Hoffman для просмотра моих просмотров.Dust.js потоковые представления с использованием Mongoose

Я в настоящее время пытается расширить an example, предоставленный официальным репозиторием Dust.js.

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

app.js

var app = express(); 

app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'dust'); 
app.engine('dust', hoffman.__express()); 

app.use(hoffman.stream); 

app.get('/', function (req, res) { 
    res.stream("hello", { 
    "test": function(chunk, context, bodies, params) { 
     //This works as expected 
     //return [{name:"This is a name"},{name:"This is another name"}]; 

     return model.find().lean().exec(function(err, docs) { 
       return docs; 
      }); 
    }, 
    "test1": function(chunk, context, bodies, params) { 
     return modelB.find(function(err, docs) { 
       return docs; 
      }); 
    } 
    }); 
}); 

hello.dust

{#test} 
    <br>{name} 
{/test} 

{#test1} 
    <br>{name} 
{/test1} 
+0

Каков результат работы 'model.find()'? Если вы его запишите. Это массив документов? – Interrobang

+0

Hello @Interrobang, с новым годом. Моя модель возвращает массив документов. например '[{ _id: 5687 cf282018e4df73b62ea8, имя: 'вставив 1451740968750', __v: 0 }, { _id: 5687 cf282018e4df73b62ea9, имя: 'вставив 1451740968750', __v: 0 }] ' – Theodore

ответ

1

Я считаю, что вопрос с использованием .find. Mongoose docs show that you must have a callback, что Mongoose будет ссылаться на документы, поскольку .find не является синхронным.

Вы возвращаете возвращаемое значение .exec, что представляется обещанием.

Глядя на источнике Mongoose, если вы передаете обратный вызов .exec, он будет resolve the Promise with nothing:

if (!_this.op) { 
    callback && callback(null, undefined); 
    resolve(); 
    return; 
} 

У вас есть несколько вариантов для передачи данных асинхронной пыли с помощью помощника. Во-первых, вы можете вернуть Promise или Stream от своего помощника, который Dust будет правильно читать. Mongoose предлагает Query#stream для этой цели.

var stream = Thing.find({ name: /^hello/ }).stream(); 

В противном случае, вы можете вручную оказывать Пыль chunk в функции обратного вызова Mongoose:

"test": function(chunk, context, bodies, params) { 
    return chunk.map(function(chunk) { 
    model.find().lean().exec(function(err, docs) { 
     chunk.section(docs, context, bodies); 
     chunk.end(); 
    }); 
    }); 
}, 

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

+0

Привет, прекрасный ответ. Я не мог найти документацию, указывающую, как работают куски. Спасибо за ваш ответ, хотя :) – Theodore

+1

[Контекстные помощники] (http://www.dustjs.com/guides/context-helpers/) подробно рассказывает о кусках. Я думаю, что возвращение потока от помощника будет быстрее/проще для вас, особенно если вы используете потоковое воспроизведение Хоффмана. – Interrobang

+0

Я заработал это, просто еще один простой вопрос - можно ли разбивать поток и перенаправлять мое приложение на страницу 404, если одна из моих функций не была выполнена? – Theodore

 Смежные вопросы

  • Нет связанных вопросов^_^