Что я должен сделать, чтобы избавиться от ошибки приведения мангуста при использовании метода findById

#node.js #mongodb #express #mongoose

Вопрос:

когда я использовал findById метод , определенный мангустом, я получил ошибку приведения примерно так

 CastError: Cast to ObjectId failed for value "611411089cb0c839083962ba4" (type string) at path "_id" for model "Product"
    at model.Query.exec (/home/user/web/mern/emartwell/node_modules/mongoose/lib/query.js:4498:21)
    at model.Query.Query.then (/home/user/web/mern/emartwell/node_modules/mongoose/lib/query.js:4592:15)
    at processTicksAndRejections (internal/process/task_queues.js:95:5)
 

Но мне нужно, чтобы продукт не обнаружил ошибку.

маршрут, который я указал, это

 http://localhost:5000/api/products/611411089cb0c839083962ba4
 

Код

productRoute.js

 
import express from "express";
import asyncHandler from "express-async-handler";
import Product from "../models/productModel.js";


const router = express.Router();

router.get(
    "/:id",
    asyncHandler(async (req, res) =>
    {
        const product = await Product.findById(req.params.id);
        if (product)
        {
            res.json(product);
        } else
        {
            res.status(404).send({ message: "Product not found" });
        }
    })
);

export default router;


 

Пожалуйста, помогите мне избавиться от этой проблемы.
Заранее спасибо 😀

Ответ №1:

проверьте req.params.id , правильно ли это .

использовать

  Product.findOne({ _id : req.params.id }).
  exec((error, product) => {
//what ever you want
})
 

Маршрут для продуктов

 router.get('/getproductById/:id', productController.getProductById_get);

 

Контроллер продукта

 module.exports.getProductById_get = async (req, res) => {
  Product.findOne({ _id : req.params.id }).
  exec((error, product) => {
    if(error) {return res.status(400).json({ error })};
    if(product) {
      res.status(200).json({ product });
    }
  })
}

 

Обновить

 import express from "express";
import asyncHandler from "express-async-handler";
import Product from "../models/productModel.js";


const router = express.Router();

router.get(
    '/:id',
    asyncHandler(async (req, res) =>
    {
        const product = await 
        Product.findOne({_id:req.params.id}).
        exec((error,product) => {
        if (product)
        {
            res.json({product});
        } else
        {
            res.status(404).send({ message: "Product not found" });
        }
    })
);
 

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

1. можете ли вы описать работу, лежащую в основе кода

2. Product.findOne({ _id : req.params.id }) найдет ваш товар по идентификатору и res.status(200).json({ product }); вернет объект товара

3. @aravindks Документ mongodb -> > docs.mongodb.com/manual/reference/method/db.collection.findOne

4. @aravindks Я обновляю ответ кодом, использую его и сообщаю мне, если вы получите какую-либо ошибку.