我正在尝试使用Mongoose和ExpressJS在MongoDB中运行两个异步查询。
exports.get_options_data = function (req, res) {
var rooms = [];
var areas = [];
async.parallel({
rooms : AddProperty.distinct("roomQty", function (err, data) {
if (err)
res.send({ code: '500', message: err });
rooms = data;
}),
areas: AddProperty.distinct("area", function (err, data) {
if (err)
res.send({ code: '500', message: err });
areas = data;
})
}, function(err, data){
res.send({ code: '200', rooms: rooms, areas : areas });
})
}
为此,我正在使用异步并行。我已经使用npm i async
安装了异步功能。
我想要的是执行这两个查询,并将查询的响应作为组合的JSON一起发送。
但是,执行此操作时出现错误:
TypeError:wrapAsync(...)不是函数
还有,有什么更好的方法可以做到这一点吗?
答案 0 :(得分:1)
async. parallel
接受一个函数数组,而不是一个对象。
节点现在支持承诺,因此您可以仅使用Promise.all
作为替代。您可以使用util.promisify
AddProperty.distinct
变成基于承诺的功能
const util = require('util');
const addProperty = util.promisify(AddProperty.distinct);
Promise.all([
addProperty('roomQty'),
addProperty('area')
]).then((data){
res.send({ code: '200', rooms: data[0], areas : data[1] });
}).catch(error => {
res.send({ code: '500', message: error });
});
答案 1 :(得分:0)
感谢Anthony Winzlet和Neil Lunn的建议。根据您的评论和指导,我进一步研究了async.parallel
并通过以下代码解决了问题:
exports.get_options_data = function (req, res) {
async.parallel({
rooms : function (callback) {
AddProperty.distinct("roomQty", function (err, response) {
callback(err, response)
})
},
areas : function (callback) {
AddProperty.distinct("area", function (err, response) {
callback(err, response)
})
}
}, function (err, data) {
if (err)
res.send({ code: '500', message: err });
res.send({ code: '200', data: data });
})
}