Экспресс-маршрут все еще возвращает элемент, удаленный из mongodb

#node.js #mongodb #express

Вопрос:

У меня есть этот маршрут, чтобы удалить «гараж» из базы данных mongodb, а затем захватить некоторые из оставшихся гаражей. По какой-то причине он все еще возвращает удаленный гараж и возвращает его, но если я проверю базу данных, удаление прошло успешно.

 router.post('/garage/delete', requireLogin, async (req, res) => {
    let limit = 20;
    try {
        let list = req.body;
        list.map( async (item) => {
            const existingGarage = await Garage.find({_id: item._id});
            if (existingGarage) {
                await Garage.deleteOne({_id: item._id});
            } else {
                res.status(400).send("Garage not found");
            }
        })
        const allGarages = await Garage.find().limit( limit );
        console.log(allGarages);
        res.send(allGarages);
    } catch {
        res.status(400).send("Garage not found");
    }
})
 

Ответ №1:

Вам нужно будет дождаться всех обещаний, возвращаемых функцией карты.

Обещать.все ждут множества обещаний и выполняют их параллельно.
поскольку вы передаете асинхронную функцию функции map, вам нужно будет дождаться всех обещаний, возвращаемых этой асинхронной функцией
. Другое решение-использовать цикл for of

 router.post('/garage/delete', requireLogin, async (req, res) => {
    let limit = 20;
    try {
        let list = req.body;
        await Promise.all(list.map( async (item) => {
            const existingGarage = await Garage.find({_id: item._id});
            if (existingGarage) {
                await Garage.deleteOne({_id: item._id});
            } else {
                res.status(400).send("Garage not found");
            }
        }))
        const allGarages = await Garage.find().limit( limit );
        console.log(allGarages);
        res.send(allGarages);
    } catch {
        res.status(400).send("Garage not found");
    }
})