Resolving the issue : Cast to ObjectId failed for value “[object Object]” (type string) at path “_id” for model “products”

  Kiến thức lập trình

Error message:

Cast to ObjectId failed for value "[object Object]" (type string) at path "_id" for model "products".

I’m attempting to retrieve a product, but I keep encountering the above error.

productController.jsx

const formidable = require("formidable");
const { responseReturn } = require("./../../utiles/response");
const cloudinary = require("cloudinary").v2;
const productModel = require("./../../models/productModels");

class productController {
    add_product = async (req, res) => {
        const { id } = req;

        // Création d'une instance de formidable pour analyser les formulaires multipart
        const form = formidable({ multiples: true });

        // Analyse la requête entrante (req)
        form.parse(req, async (err, field, files) => {
            // console.log(files[0]);
            // console.log(files.images[0]);
            // console.log(files);
            // console.log(field);

            // Extraction des champs non fichiers depuis field
            let { name, category, brand, price, stock, discount, description, shopName } = field;

            // Extraction des fichiers depuis files
            const { images } = files;

            // Traitement du champ name pour créer un slug
            name = name.trim();
            const slug = name.split(" ").join("-");

            cloudinary.config({
                cloud_name: process.env.cloud_name,
                api_key: process.env.api_key,
                api_secret: process.env.api_secret,
                secure: true,
            });

            // On veut load notre multiple images
            try {
                let allImageUrl = [];
                for (let index = 0; index < images.length; index++) {
                    const result = await cloudinary.uploader.upload(images[index].filepath, { folder: "products" });
                    // Le folder se cré dans le cloudinary.

                    // Cette ligne de code permet de push les images dans le tableau allImageUrl
                    allImageUrl = [...allImageUrl, result.url];
                }

                await productModel.create({
                    sellerId: id,
                    name,
                    slug,
                    shopName,
                    category: category.trim(),
                    description: description.trim(),
                    stock: parseInt(stock),
                    price: parseInt(price),
                    discount: parseInt(discount),
                    brand: brand.trim(),
                    images: allImageUrl,
                });

                responseReturn(res, 201, { message: "Product Added Successfully" });
            } catch (error) {
                console.error("Error adding product:", error);
                responseReturn(res, 500, { error: "Internal Server Error" });
            }
        });
    };

    // End method

    products_get = async (req, res) => {
        const { page, searchValue, parPage } = req.query;
        const { id } = req;

        const skipPage = parseInt(parPage) * (parseInt(page) - 1);

        try {
            if (searchValue) {
                const products = await productModel
                    .find({
                        $text: { $search: searchValue },
                        sellerId: id,
                    })
                    .skip(skipPage)
                    .limit(parPage)
                    .sort({ createdAt: -1 });
                const totalProduct = await productModel
                    .find({
                        $text: { $search: searchValue },
                        sellerId: id,
                    })
                    .countDocuments();
                responseReturn(res, 200, { products, totalProduct });
            } else {
                const products = await productModel
                    .find({ sellerId: id })
                    .skip(skipPage)
                    .limit(parPage)
                    .sort({ createdAt: -1 });
                const totalProduct = await productModel.find({ sellerId: id }).countDocuments();
                responseReturn(res, 200, { products, totalProduct });
            }
        } catch (error) {
            console.log(error);
        }
    };
    // End method

    product_get = async (req, res) => {
        const { productId } = req.params;
        try {
            const product = await productModel.findById(productId);
            responseReturn(res, 200, { product });
        } catch (error) {
            console.log(error.message);
        }
    };
    // End Method
}

module.exports = new productController();

productRoutes.js

const productController = require("./../../controllers/dashboard/productController");
const { authMiddleware } = require("../../middlewares/authMiddleware");
const router = require("express").Router();

router.post("/product-add", authMiddleware, productController.add_product);
router.get("/products-get", authMiddleware, productController.products_get); // get all products
router.get("/product-get/:productId", authMiddleware, productController.product_get);

module.exports = router;

EditProduct.jsx

import React, { useEffect, useState } from "react";
import { Link, useParams } from "react-router-dom";
import { useDispatch, useSelector } from "react-redux";
import { get_category } from "./../../store/Reducers/categoryReducer";
import { get_product } from "./../../store/Reducers/productReducer";

function EditProduct() {
    // productId vient du fichier routes/sellerRoutes.js
    const { productId } = useParams();

    const dispatch = useDispatch();

    // Permet de récupérer les catégories dans notre state
    const { categories } = useSelector((state) => state.category);

    // on peut acceder à product car on l'a déclaré dans le fichier productReducer (product)
    const { product } = useSelector((state) => state.product);

    useEffect(() => {
        dispatch(
            // get_category provient du fichier categoryReducer
            get_category({
                searchValue: "",
                parPage: "",
                page: "",
            })
        );
    }, []);

    useEffect(() => {
        dispatch(
            // get_category provient du fichier categoryReducer
            get_product({ productId })
        );
    }, [productId]);

    const [categoryShow, setCategoryShow] = useState(false);
    const [category, setCategory] = useState("");
    // const [allCategory, setAllCategory] = useState([]);
    const [allCategory, setAllCategory] = useState(categories);
    const [searchValue, setSearchValue] = useState("");

    const aryane = "azertyuiopqsdfghjkMDFRxcvbn";
    const categorySearch = (event) => {
        const value = event.target.value;
        // on doit passer notre valeur dans le setsearchValue
        setSearchValue(value);
        // on doit filtrer les categories
        if (value) {
            let searchValue = allCategory.filter(
                (category) => category.name.toLowerCase().indexOf(value.toLowerCase()) > -1
            );
            setAllCategory(searchValue);
        } else {
            setAllCategory(categories);
        }
    };

    const [state, setState] = useState({
        name: "",
        description: "",
        discount: "",
        price: "",
        brand: "",
        stock: "",
    });

    const inputHandle = (event) => {
        setState({
            ...state,
            [event.target.name]: event.target.value,
        });
    };

    const [images, setImages] = useState([]);
    const [imageShow, setImageShow] = useState([]);

    const changeImage = (img, files) => {
        if (files.length > 0) {
            console.log(files[0]);
            console.log(img);
        }
    };

    useEffect(() => {
        setState({
            name: product.name,
            description: product.description,
            discount: product.discount,
            price: product.price,
            brand: product.brand,
            stock: product.stock,
        });
        setCategory(product.category);
        setImageShow(product.images);
    }, );

And the code with the _id in Product.jsx

 <Link
 to={`/seller/dashboard/edit-product/${product._id}`}                                              className="p-[6px] bg-yellow-500 rounded hover:shadow-lg hover:shadow-yellow-500/50">{" "}
 <FaEdit />{" "}
 </Link>

Theme wordpress giá rẻ Theme wordpress giá rẻ Thiết kế website

LEAVE A COMMENT