اذهب إلى المحتوى

السؤال

نشر

حاولت كثيرا في ايجاد حل لاضافة المنتج الى سلة الشراء ورفع صورة ولم استطيع فعل ذلك

import axios from "../config/axios";
import { GET_PRODUCT_URL,ADD_TO_CART } from "../config/urls";
import { useEffect, useState } from "react";
import "../styles/getProduct.css";
import Navbar from "./navbar/navbar";
import { useParams } from "react-router-dom";

function GetProduct() {
  const [product, setProduct] = useState("");
  const [image, setImage] = useState("");
  const [title, setTitle] = useState("");
  const [description, setDescription] = useState("");
  const [price, setPrice] = useState("");

    const id = window.location.pathname.split("/")[2];
    console.log(id);
    
    const cartid = useParams()
  

  useEffect(() => {
    getProduct();
  }, []);

 const headers = {
    userId:localStorage.getItem("id"),
    productId:id,
    quantity:1
 }
  
  const addToMyCart = async () => {
   

    try {
      const tokenValue = localStorage.getItem("token");
      let token = JSON.parse(tokenValue);

      await axios
        .post(ADD_TO_CART ,{headers:headers},
            
          {
            headers: {
              Authorization: token,
            },
          }
        )

        .then((res) => {
          console.log(res);
        });
    } catch (e) {
      console.log(e);
    }
  };

  const getProduct = async () => {
    try {
      const tokenValue = localStorage.getItem("token");
      let token = JSON.parse(tokenValue);

      await axios
        .get(GET_PRODUCT_URL + "/" + id, {
          headers: {
            Authorization: token,
          },
        })
        .then((res) => {
          console.log(res);
          setProduct(res.data);
          setImage(res.data.image);
          setTitle(res.data.title);
          setDescription(res.data.description);
          setPrice(res.data.price);
        });
    } catch (e) {
      console.log(e);
    }
  };

  return (
    <>
      <Navbar />
      <div class="container ">
        <div class="grid text-center">
          <div class="row align-items-start">
            <div class="col">
              <div class="card-header">Featured</div>

              <img src={image} class="card-img-top" alt="..." height="200px" />
            </div>
            <div class="col" style={{ textAlign: "left" }}>
              <div class="card-body mt-4">
                <h5 class="card-title">{title}</h5>
                <p class="card-text" style={{ width: "50%" }}>
                  {description}
                </p>
              </div>
            </div>
            <div class="col edit-col-3">
              <div className="edit-div">
                <p>{price}$</p>
                <p>FREE delivery</p>
                <small class="text-body-secondary d-flex float-end">
                  <button class="btn"
                    onClick={() => {
                        addToMyCart()
                        
                       }}
                  >
                    <i
                      class="fa-solid fa-cart-shopping"
                      style={{ color: "deeppink" }}
                    ></i>
                    addToCart
                  </button>
                </small>
              </div>
            </div>
          </div>
        </div>
      </div>
    </>
  );
}

export default GetProduct;

وفي الواجهة الخلفية كل شيء يعمل على مايرام

Screenshot 2025-02-15 022929.png

Screenshot 2025-02-15 023016.png

Screenshot 2025-02-15 023125.png

Screenshot 2025-02-15 023235.png

Screenshot 2025-02-15 023318.png

test.zip

Recommended Posts

  • 1
نشر

الخطأ الأساسي لديك أنك تقوم بمحاولة إرفاق عنوان الصورة التي تحاول رفعها من الواجهة الأمامية وهذا خاطئ . حيث لا يجب إرسال عنوان بل يجب إرسال الملف نفسه من الواجهة الأمامية لتستطيع حفظ الملف من خلال الواجهة الخلفية.

في ملف frontend\src\components\createProduct.js سطر 20 يجب إرسال ال image وليس req.file.path حيث لا يوجد ما يسمى req في الواجهة الأمامية وأيضا المتغير لم تقم بتمريره لهذا يحدث خطأ أنك تحاول إستخدام متغير req فارغ . لهذا يجب عليك إستبدال السطر بالتالي :

formData.append('image',  image);

بعد ذلك في سطر 43 يرجى وضع الملف مباشرة وليس العنوان url هكذا :

setImage(e.target.files[0]);

بعد ذلك في سطر 52 يرجى إستبداله بالتالي لتظهر الصورة في النموذج form حينما تقوم برفعها :

<img src={image ? URL.createObjectURL(image):""} style={{ margin: "0 auto", width: "25%" }} />

الآن تم حل مشكلة الواجهة الأمامية .

توجد مشكلة في الواجهة الخلفية في ملف backend\routes\index.js حيث في سطر 26  انت تحاول إستقبال الملف بإسم file ولكنك في الواجهة الأمامية قمت بإرساله من خلال إسم image وليس file لذلك يمكنك إما تغيره هنا أو في الواجهة الأمامية . ويمكنك تغيره هنا هكذا :

router.post("/create-products",upload.single("image"),isLoggedIn,productController.createProduct);

اما بخصوص الإضافة إلى cart فأنت في الواجهة الأمامية تقوم بإرسال البيانات في ال headers وهذا خاطئ حيث يجب إرسالها في ال body وأنت تستقبلها من ال body في الواجهة الخلفية.وأيضا يجب أن تقوم بعمل parse للبيانات التي تقوم بإحضارها من ال localStorage .

لهذا في ملف frontend\src\components\getProduct.js سطر رقم26 يرجى إستبداله بالتالي :

userId: JSON.parse(localStorage.getItem("id")),

وسطر 39 يجب إستبداله بالتالي :

.post(ADD_TO_CART ,headers,

 

ولقد قمت بإرفاق الملفات لك بعد التعديل .

index.js createProduct.js getProduct.js

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...