[英]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()
失敗,我們將錯誤發送回客戶端。
為了分隔回復中的數據,我將數據分為兩個字段, count
和find
。 這樣,您可以輕松地從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.