我需要查询2个不同的集合并在明确的响应中发送它。对于需要做什么,我有一个非常含糊的想法。我试图将查询文档联系到一个空数组,并将该新数组作为响应发送。但我收到一个空数组作为回应。
这是我的路线。
site.route('/campus/development')
.get(function(req, res) {
var devPosts = [];
development.find().exec(function(err, docs) {
if (err) {
console.log('Error : ' + err);
} else {
if (docs != null) {
devPosts = devPosts.concat(docs);
console.log(docs);
} else {
console.log('No posts found');
}
}
});
jobs.find().exec(function(err, jobs) {
if (err) {
console.log('Error : ' + err);
} else {
if (jobs != null) {
devPosts = devPosts.concat(jobs);
console.log(jobs);
} else {
console.log('No jobs');
}
}
});
res.send(devPosts);
});
答案 0 :(得分:1)
这是由于对数据库的请求的异步操作。有各种各样的解决方案,但基本上可以提炼为两种类型:回调或承诺。
回调解决方案可能如下所示:
site.route('/campus/development')
.get(function(req, res) {
development.find().exec(function(err, devDocs) {
if (err) {
console.log('Error : ' + err);
} else {
if (devDocs != null) {
console.log(devDocs);
jobs.find().exec(function(err, jobs) {
if (err) {
console.log('Error : ' + err);
} else {
if (jobs != null) {
console.log(jobs);
res.send([devDocs, jobs]);
} else {
console.log('No jobs');
}
}
});
} else {
console.log('No posts found');
}
}
});
});
但是这引入了一些有趣的问题:一个是称为回调地狱的现象,另一个是你应该回应错误,这意味着你需要对每个错误进行响应调用(尽管这是一个非常简单的方法)。
如前所述,还有另一种涉及使用承诺的解决方案。您可以使用一堆库,实际上Mongoose会从exec
方法返回一个承诺。但是,如果你在Node 0.12.x上,你也可以使用本机Promise(它在0.11中引入,但你应该使用0.11.x而不是0.11.x)。使用本机承诺比使用Mongoose返回的承诺更有利的一点是,您可以并行执行这些请求,因为它们并不相互依赖。
site.route('/campus/development')
.get(function(req, res) {
Promise.all([
development.find().exec(), // returns a promise
jobs.find().exec() // returns a promise
]).then(function(results) {
// results is [devDocs, jobs]
console.log(results);
res.send(results);
}).catch(function(err) {
res.send(err);
});
});