MongoDB Node.js中的另一个异步/等待功能中的异步/等待功能

时间:2020-05-28 19:31:20

标签: node.js mongodb asynchronous async-await

我正在尝试使用特定的业务逻辑搜索MongoDB集合的可用对象(例如,ParkingSpot),问题是在此函数中这是一个异步/等待功能,我正在使用.find()查找另一个集合中也可以用作异步/等待。第二个函数未执行,而是作为一个承诺“ Promise {}”返回,因此未应用业务逻辑。你能帮我吗? 这是第一个函数:

exports.get_parkingSpots_avail_for_parking = async (req, res, next) => {
    try {
        const radius = req.body.radius;
        const userLatitude = req.body.userLatitude;
        const userLongitude = req.body.userLongitude;
        const reqStartDate = new Date(req.body.reqStartDate);
        const reqEndDate = new Date(req.body.reqEndDate);



        const parkingSpots = await ParkingSpot.find({
            isAvailable: true
        }, (err, parkingSpots) => {
            if (err) {
                return res.status(500).json({
                    error: err
                });
            }
            const freeParkingSpots = parkingSpots.filter(parkingSpot => {
                return distanceCalculator(parkingSpot.latitude, parkingSpot.longitude, userLatitude, userLongitude) < radius
            })
            const availParkingSpots = freeParkingSpots.filter( freeParkingSpot => {
               // console.log(freeParkingSpot._id);
                console.log(isParkingAvailable(reqStartDate, reqEndDate, freeParkingSpot._id));
                return isParkingAvailable(reqStartDate, reqEndDate, freeParkingSpot._id);
            })            
        }).select('_id userId number address latitude longitude notes isAvailable startOfAvailability endOfAvailability');

        console.log(parkingSpots);
        if (parkingSpots.length > 0) {
            return res.status(200).json({
                parkingSpots: parkingSpots
            });
        }
        return res.status(404).json({
            message: "No available parking spots for requeste period"
        });

    } catch (err) {
        res.status(500).json({ 
            error: err
        })
    }
};

Second function which is being called :
module.exports = async function isParkingAvailable(reqStartDate, reqEndDate, parkingSpotId) {
    const parkingSpotBookings =  await Booking.find({ parkingSpotId: parkingSpotId})
        .select('_id parkingSpotId sharerUserId renterUserId startDate endDate');
    if (parkingSpotBookings.length == 0) {
        return true;
    }
    parkingSpotBookings.filter(booking => {
        //console.log(parkingSpotId);
        //console.log("Is overlapping" +!isOverlapping(reqStartDate, reqEndDate, booking.startDate, booking.endDate));
        return !isOverlapping(reqStartDate, reqEndDate, booking.startDate, booking.endDate)
    })
}

所以问题在于,调用第二个函数的方式与console.log中一样:Promise {}

1 个答案:

答案 0 :(得分:2)

等待将结果返回到您的 parkingSpot 变量。 对于第二个功能: 您已将此函数定义为异步函数,这意味着它正在保持异步进程,并且在Node JS es6中,异步进程被视为promise,因此,如果您不使用await调用它,它将仅返回promise

exports.get_parkingSpots_avail_for_parking = async (req, res, next) => {
    try {
        const radius = req.body.radius;
        const userLatitude = req.body.userLatitude;
        const userLongitude = req.body.userLongitude;
        const reqStartDate = new Date(req.body.reqStartDate);
        const reqEndDate = new Date(req.body.reqEndDate);

        const parkingSpots = await ParkingSpot.find({isAvailable: true}).select('_id userId number address latitude longitude notes isAvailable startOfAvailability endOfAvailability');
        const freeParkingSpots = parkingSpots.filter(parkingSpot => {
            return distanceCalculator(parkingSpot.latitude, parkingSpot.longitude, userLatitude, userLongitude) < radius
        });
        const availParkingSpots = freeParkingSpots.filter( async freeParkingSpot => {
            /* You have defined this function as an async, that means it is holding asynchronous process, and in 
Node JS es6 async process is processed as a promise, so if you won't call it with await it will return a promise only */
            return await isParkingAvailable(reqStartDate, reqEndDate, freeParkingSpot._id);
        });

        if (parkingSpots.length > 0) {
            return res.status(200).json({
                parkingSpots: parkingSpots
            });
        }
        return res.status(404).json({
            message: "No available parking spots for requeste period"
        });

    } catch (err) {
        res.status(500).json({
            error: err
        })
    }
};

我希望它将对您有所帮助。

谢谢

相关问题