2016-07-10 13 views
0
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); 
    }); 
}); 

基本的には、これらの2つのクエリを並列に実行し、出力をフロントエンドに送信します。私はそれを達成する方法がわかりません、みんな助けて! フロントエンドでこれら2つの結果を簡単に分離する方法もあります。私は角度jを使用しています。1つの呼び出しで複数のクエリを実行する方法

+0

応答を確認してください。 – Iceman

+0

'return_data'とは何ですか? – noisypixy

+0

@noisypixy私は彼が結合したデータを意味すると思います – Iceman

答えて

0

を。

もちろん、内部に約束が必要なので、コールバックが呼び出されたときに実行されるpromiseにあなたの2つの機能をそれぞれラップします。

2つのクエリのいずれかが失敗した場合は、Promise.all()も失敗し、クライアントにエラーを返します。

返信でデータを区切るには、データを2つのフィールド、つまりcountfindに分割します。このように、あなたはangularjsから簡単にそれらを読んで、あなたはNode.jsの0.10.xを使用しているの約束」の原因を使用できない場合は、

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 
     }); 
    } 
}); 

を望むようにそれらを使用することができ、あなたはこのような何かを行うことができます。

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(); 
    }); 
}); 
+0

返事に感謝しますが、約束を使って与えた最初の解決策では、エラーを投げています。 –

0

これらを並べて実行し、両方の実行後にデータを送信することができます。そのような操作を容易に行うための多くのライブラリの1つであるasync libraryをチェックしてください。

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); 
}); 
0

あなたは、追加のライブラリなしでそれをしたい場合は、これに似た何かを行うことができます:あなたは両方のクエリが終了するまで待機するPromise.all()を使用したい

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. 
    }); 
}); 
関連する問題