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,所以如果它有进行同步查找的选项,我们可以对此进行更多研究。