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>