wrapAsync(...)在MongoDB和Mongoose中不是函数

时间:2019-03-26 06:25:25

标签: node.js mongodb express mongoose

我正在尝试使用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(...)不是函数

还有,有什么更好的方法可以做到这一点吗?

2 个答案:

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