Как правильно использовать запрос findOne MongoDB?

#javascript #arrays #database #mongodb #mongoose

Вопрос:

Моя цель-вернуть один объект продукта в зависимости от идентификатора продукта, который я отметил зеленым цветом (из всего массива продуктов в моей базе данных mongo).

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

Моя внутренняя запись выглядит следующим образом:

 router.get("/:id", async (req, res)=> {
  const mid=req.params.id;
  console.log(mid)
  const products = await Product.findOne({ id: mid })
  console.log(products)
  if (products) {
    res.send(products);
  } else {
    res.status(404).send({message:"product not found"})
  } 
});
 

Connsole.log(mid) в третьей строке работает, и он возвращает правильный идентификатор. Однако, когда я пытаюсь отфильтровать этот один массив в зависимости от значения в третьей строке, я всегда возвращаю первый объект моей базы данных, которым является камера gopro, вместо нужного объекта.

Вывод выглядит следующим образом:

 632834528
{
  _id: '5f9849daf641a82b257d529b',
  id: 3484,
  agentId: 66343,
  title: 'GoPro Camera',
  slug: 'gopro',
 

Что я делаю не так?

Я тоже пытался const products = await Product.find({ id: mid }) , но это возвращает мне весь массив, а не только один объект.

Ответ №1:

Я думаю, что он возвращает запрос. Попробуй:

const products = await Product.findOne({ id: mid }).exec();

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

1. Это тоже сработало!

2. Как вы думаете, какое решение лучше (ваше или мое ниже?) и почему?

3. Я не думаю, что вам вообще нужен expressAsyncHandler. Немного странно, что это вообще решило вашу проблему в первую очередь

Ответ №2:

Это решение сработало для меня: я должен использовать Expressasynchandler следующим образом:

Редактировать: Это решение может быть не лучшим (см. Комментарии к ответу выше).

 router.get("/:id",  expressAsyncHandler(async (req, res) => {
  const mid=req.params.id;
  const products = await Product.findOne({ id: mid })
  if (products) {
    res.send([products]);
  } else {
    res.status(404).send({message:"product not found"})
  } 
}));