Dust.js 使用 Mongoose 流式传输视图
Dust.js streaming views using Mongoose
我有一个简单的应用程序,它使用 Express 和 Hoffman 视图引擎来流式传输我的视图。
我目前正在尝试扩展官方 Dust.js 存储库提供的 an example。
不幸的是,我无法使用 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 将调用文档的 Mongoose docs show that you must have a callback,因为 .find
不是同步的。
您正在 return 计算 .exec
的 return 值,这似乎是一个 Promise。
查看 Mongoose 源代码,如果您将回调传递给 .exec
,它将 resolve the Promise with nothing:
if (!_this.op) {
callback && callback(null, undefined);
resolve();
return;
}
您有几个选项可以通过助手将异步数据传递给 dust。首先,您可以 return 来自您的助手的 Promise 或 Stream,Dust 会正确读取它们。 Mongoose 为此目的提供 Query#stream。
var stream = Thing.find({ name: /^hello/ }).stream();
否则,您可以在 Mongoose 回调中手动渲染到 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,所以如果它有进行同步查找的选项,我们可以对此进行更多研究。
我有一个简单的应用程序,它使用 Express 和 Hoffman 视图引擎来流式传输我的视图。
我目前正在尝试扩展官方 Dust.js 存储库提供的 an example。
不幸的是,我无法使用 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 将调用文档的 Mongoose docs show that you must have a callback,因为 .find
不是同步的。
您正在 return 计算 .exec
的 return 值,这似乎是一个 Promise。
查看 Mongoose 源代码,如果您将回调传递给 .exec
,它将 resolve the Promise with nothing:
if (!_this.op) {
callback && callback(null, undefined);
resolve();
return;
}
您有几个选项可以通过助手将异步数据传递给 dust。首先,您可以 return 来自您的助手的 Promise 或 Stream,Dust 会正确读取它们。 Mongoose 为此目的提供 Query#stream。
var stream = Thing.find({ name: /^hello/ }).stream();
否则,您可以在 Mongoose 回调中手动渲染到 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,所以如果它有进行同步查找的选项,我们可以对此进行更多研究。