Привет. Как использовать поисковый запрос в базе mongoose — Express MongoDB

#node.js #express #mongoose

#node.js #экспресс #mongoose

Вопрос:

Что я делаю, так это пытаюсь написать логику для корзины в моем веб-приложении, которое я создаю. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что когда я использую запрос для поиска корзины по идентификатору :

    const isCart = await cartModel.findById("5f82372f2654ce1d18553ac4");
  

или вот так

    const isCart = await cartModel.find({ _id : "5f82372f2654ce1d18553ac4"} );
  

если корзина существует с этим идентификатором, все работает хорошо, она возвращает мне эту корзину, но если в БД корзина не существует с этим идентификатором, то она выдает мне ошибку. ПОЧЕМУ (рис. ниже)?? Было бы разумнее, если бы он возвращал пустой массив или объект, чтобы я мог продолжить построение логики, которую я хочу сделать. Но как только он выдает ошибку, он отключает всю дальнейшую логику. Я не могу написать, если ничего не найдено, создать новую корзину и так далее. Надеюсь, вы поняли, что я имею в виду. Это то, что я неправильно пишу запрос, или так оно и есть. Если это так, то, я думаю, я уже должен управлять им на стороне клиента — если он возвращает ошибку на стороне клиента, тогда клиентская сторона отправляет новый запрос на новый маршрут при создании новой корзины и так далее…

введите описание изображения здесь

Вот решение, которое я сделал после того, как кто-то сказал мне, что я могу попробовать сделать с помощью try — catch

Вот результат, он работает, я не уверен, подходит ли это решение

 async function sendCart (code, cart, res){
    res.status(code).json({
        status: "success",
        data: {
            cart
        }
    })
}

exports.createCart = async (req, res, next) => {
    try{
        const isCart = await cartModel.findById(req.params.id);
        await sendCart(200, isCart, res);
    }
    catch(error){
        const newCart = await cartModel.create({ items: [] });
        await sendCart(201,newCart, res);
    }
}
  

Комментарии:

1. Приложение, похоже, сбой из-за необработанного отклонения обещания. Если корзина не существует, она вернет ошибку, но вы ее не обрабатываете, поэтому получаете необработанную ошибку отклонения обещания. Поскольку вы используете синтаксис asnyc / await, вы, вероятно, можете решить эту проблему с помощью блока try / catch .

2. Я понимаю. Позвольте мне попробовать

3. Я сделал это, это работает, отредактировано в моем сообщении

4. изменится ли это, если вы сделаете запрос по new ObjectId("5f82372f2654ce1d18553ac4") — вам придется требовать его от mongoose const mongoose = require('mongoose'); const { ObjectId } = mongoose.Types;