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做同步发现,我们可以看看更多。