【问题标题】:Node JS, express, Mongoose, nested queriesNode JS、express、Mongoose、嵌套查询
【发布时间】:2011-11-13 22:46:22
【问题描述】:

我有一组带有 express/mongoose 的嵌套查询,很像这样:

app.get(..., function(...) {

   Schema1.query(..., function(..., res1) {

      for ( var key in res1 ) {
           Schema2.query(..., function(..., res2) {
             data[key].appendedAttribute = res2.somedata;
            });
      }

      res.render(..., data);
   });

});

这不起作用,即 appendedAttribute 永远不会附加到数据集。我做错了什么?

【问题讨论】:

  • 异步编程不是这样工作的

标签: javascript mongodb node.js express


【解决方案1】:

使用after

app.get(..., function(...) {
    Schema1.query(..., function(..., res1) {
        var cb = after(Object.keys(res1).length, function () {
            res.render(..., data);    
        });

        for (var key in res1) {
            Schema2.query(..., function(..., res2) {
                data[key].appendedAttribute = res2.somedata;
                cb();
            });
        }
    });
});

基本上,您只能在第二个查询完成后触发res.render 调用。

【讨论】:

  • 难道你不应该在所有查询都执行后才调用 cb() 吗? (因此只有一次)
  • @alessioalex cb 必须调用n 次。在它继续之前。 n 是after 的第一个参数。即他进行的 Schema2 查询量。
【解决方案2】:

使用Step:

app.get(..., function(...) {
  var data;
  Step(
    function first_query() {
      Schema1.query(...,this);
    },
    function multiple_queries(err, res1) {
      for (var key in res1) {
        Schema2.query(..., function(..., res2) {
          data[key].appendedAttribute = res2.somedata;
          this.parallel(); // make sure callback gets executed only after all the queries are executed
        });
      }     
    },
    function render() {
      res.render(..., data);
    }
  );
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 2016-06-25
    • 2020-08-21
    • 2016-02-07
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多