簡體   English   中英

如何在1個get調用nodejs中運行多個查詢

[英]How to run more than one query in 1 get call nodejs

app.get('/projects/:company_id', function(req, res){
    var company_id = req.params.company_id;

    //query1
    db.projects.count({"company_id": company_id },function(err, doc){   
        res.json(doc);
    });
    //query2
    db.projects.find({"company_id": company_id },function(err, doc){    
        res.json(return_data);
    });
});

基本上,我希望這兩個查詢並行運行,然后將輸出發送到前端。 我不確定如何實現這一目標,伙計們! 還有一種簡便的方法可以在前端將這兩個結果分開。 我正在使用角度js。

您可以並排運行它們,並在兩次運行后發送數據。 檢查異步庫(是眾多庫之一)可輕松進行此類操作。

var async = require("async");
async.parallel({
    one: function(callback) {
        db.projects.count({"company_id": company_id },function(err, doc){   
            callback(null, doc)
        });
    },
    two: function(callback) {
        db.projects.find({"company_id": company_id },function(err, doc){    
            callback(null, doc);
        });
    }
}, function(err, results) {
    var payload = {
        count : results.one,
        data: results.two
    }
    res.json(payload);
});

如果要在沒有任何其他庫的情況下執行此操作,則可以執行以下操作:

app.get('/projects/:company_id', function(req, res) {
  // Create an object resembling your final response,
  // but replace the values with a promise.
  var futureData = {
    count: new Promise(function(resolve, reject) {
      db.projects.count({'company_id': company_id}, function(err, doc) {
        if (err) {
          return reject(err);
        }
        return resolve(doc);
      });
    }),
    results: new Promise(function(resolve, reject) {
      db.projects.find({'company_id': company_id}, function(err, doc) {
        if (err) {
          return reject(err);
        }
        return resolve(doc);
      });
    }),
  };

  var keys = Object.keys(futureData);

  // Wait until all promises are resolved.
  Promise.all(
    keys.map(key => futureData[key])
  )
    // Get the response object.
    .then(function(values) {
      // Build an object from the results of the promises,
      // using the same key as in `futureData`.
      return values.reduce(function(data, value, i) {
        var key = keys[i];
        data[key] = value;
        return data;
      }, {});
    })
    .then(function(data) {
      // Send final data.
      res.json(data);
    })
    .catch(function(err) {
      // TODO: Handle error.
    });
});

您想使用Promise.all()等待兩個查詢都完成。

當然,您需要在其中包含Promise,因此我們將您兩個函數的每一個都包裝在一個Promise中 ,該函數在調用回調時實現。

如果兩個查詢之一失敗,則Promise.all()失敗,我們將錯誤發送回客戶端。

為了分隔回復中的數據,我將數據分為兩個字段, countfind 這樣,您可以輕松地從angularjs讀取它們,並根據需要使用它們

app.get('/projects/:company_id', function(req, res){
    var company_id = req.params.company_id;

    Promise.all(
      new Promise(resolve, reject) {
        db.projects.count({"company_id": company_id },function(err, doc){   
          if (err) return reject(err);
          resolve(doc);
        });
      },
      new Promise(resolve, reject) {
        db.projects.find({"company_id": company_id },function(err, doc){   
          if (err) return reject(err);
          resolve(doc);
        });
      }
    )
    .then(data) {
      res.json({
        "count": data[0],
        "find": data[1]
      });
    }
    .catch(error) {
      res.json({
        "error": error
      });
    }
});

如果您無法使用Promises,因為您使用的是node.js 0.10.x,則可以執行以下操作:

app.get('/projects/:company_id', function(req, res){
    var company_id = req.params.company_id;
    var reply = {
      find: -1,
      count: -1
    }
    var errorSent = false;

    function sendErr(e) {
      if (errorSent) return; // Do not send twice a reply
      res.json({"error": e});
      errorSent = 1;
    }

    function sendWhenReady() {
      if (reply.count !== -1 && reply.find !== -1) res.send(reply);
    }


    //query1
    db.projects.count({"company_id": company_id },function(err, doc){
        if (err) return sendError(err);
        reply.count = doc;   
        sendWhenReady();
    });
    //query2
    db.projects.find({"company_id": company_id },function(err, doc){ 
        if (err) return sendError(err);   
        reply.find = doc;   
        sendWhenReady();
    });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM