Async / await fun c в другом async / await fun c в Node.js, MongoDB - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь найти доступные объекты коллекции MongoDB (например, ParkingSpot), используя специфику c business logi c, проблема в том, что внутри этой функции, которая представляет собой async / await fun c Я смотрю внутрь другая коллекция с .find (), которую я также использую как async / await. Вторая функция не выполняется и возвращается в виде обещания "Promise {}", поэтому бизнес-логика c не применяется. Не могли бы вы мне помочь? Вот первая функция:

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 Ответ

2 голосов
/ 28 мая 2020

Await вернет результат в вашу переменную ParkingSpot . Для второй функции: вы определили эту функцию как asyn c, это означает, что она удерживает асинхронный процесс, а в Node JS es6 asyn c процесс обрабатывается как обещание, поэтому, если вы не будете его называть с await он вернет только обещание

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

Надеюсь, это поможет вам.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...