#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")
— вам придется требовать его от mongooseconst mongoose = require('mongoose'); const { ObjectId } = mongoose.Types;