Dust.js使用Mongoosestream式传输视图
我有一个简单的应用程序,使用快递和霍夫曼视图引擎,以stream我的看法。
我目前正在试图扩展由官方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}
我相信这个问题与你使用.find
。 Mongoose文档显示你必须有一个callback ,Mongoose将调用文档,因为.find
不同步。
您正在返回.exec
的返回值,这似乎是一个Promise。
看看Mongoose的源代码,如果你将一个callback传递给.exec
,那么它就会.exec
解决Promise :
if (!_this.op) { callback && callback(null, undefined); resolve(); return; }
你有几个选项可以通过帮助程序将asynchronous数据传递给灰尘。 首先,你可以从助手中返回一个Promise或者Stream,这个Dust将会正确的读取。 Mongoose为此提供了Query#stream 。
var stream = Thing.find({ name: /^hello/ }).stream();
否则,您可以手动呈现到Mongoosecallback中的Dust chunk
:
"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,所以如果它有一个select做同步发现,我们可以看看更多。