Getting this error , when trying to upload images through a form "TypeError: Cannot read property 'originalname' of undefined "

Getting this error , when trying to upload images through a form "TypeError: Cannot read property 'originalname' of undefined "

我的代码出现问题,我已经搜索了好几天了。我是 MERN 堆栈的新手,需要你们任何人的支持 :( 。下面的代码用于以表格形式上传 2 张图像和其他数据。

客户端编码

import styles from "../assets/css/AddItinerary.module.css";
import axios from "axios";
import { useState, useEffect } from "react";
import IndexHeader from "components/Headers/IndexHeader";
import IndexNavbar from "components/Navbars/IndexNavbar";
import { Label, Input, Button } from "reactstrap";

function AddItinerary() {
  const [itineraryId, setitineraryId] = useState("");
  const [itineraryDays, setitineraryDays] = useState("");
  const [itineraryName, setitineraryName] = useState("");
  const [itineraryDesc, setitineraryDesc] = useState("");
  const [Filename1, setitineraryImage] = useState("");
  const [Filename2, setitineraryCoverImage] = useState("");
  const [itineraryClass, setitineraryClass] = useState("");
  const [itineraryPriceAdult, setitineraryPriceAdult] = useState("");
  const [itineraryPriceChild, setitineraryPriceChild] = useState("");

  const onChangeFile = (e) => {
    setitineraryImage(e.target.files[0]);
  };
  const onChangeFile2 = (e) => {
    setitineraryCoverImage(e.target.files[0]);
  };
  function sendData(e) {
    e.preventDefault();

    const formData = new FormData();

    formData.append("itineraryId", itineraryId);
    formData.append("itineraryDays", itineraryDays);
    formData.append("itineraryName", itineraryName);
    formData.append("itineraryDesc", itineraryDesc);
    formData.append("itineraryImage", Filename1);
    formData.append("itineraryCoverImage", Filename2);
    formData.append("itineraryClass", itineraryClass);
    formData.append("itineraryPriceAdult", itineraryPriceAdult);
    formData.append("itineraryPriceChild", itineraryPriceChild);

    axios
      .post("http://localhost:8070/itineraries/add", formData)
      .then(() => {
        alert("Itinerary Addded");
        window.location.reload();
      })
      .catch((err) => {
        console.log(formData);
        console.log(err);
      });
  }
  return (
    <>
      <IndexNavbar />
      <IndexHeader />
      <div style={{ paddingTop: "50px" }} className={styles.body}>
        <br />
        <br />
        <h3 className={styles.header} style={{ textAlign: "center" }}>
          Insert Tour Itinerary Details
        </h3>
        <br />
        <br />
        <div className={styles.FormContainer}>
          <form onSubmit={sendData} encType="multipart/form-data">
            <Label for="ItineraryID">Itinerary ID</Label>
            <br />
            <Input
              type="text"
              name="ItineraryID"
              placeholder="Enter Itinerary ID"
              onChange={(e) => {
                setitineraryId(e.target.value);
              }}
            ></Input>
            <br />

            <Label for="ItineraryName">Itinerary Name</Label>
            <br />
            <Input
              type="text"
              name="ItineraryName"
              placeholder="Enter Itinerary Name"
              onChange={(e) => {
                setitineraryName(e.target.value);
              }}
            ></Input>
            <br />

            <Label for="ItineraryDays">Itinerary Days</Label>
            <br />
            <Input
              type="number"
              name="ItineraryDays"
              placeholder="Enter Duration of the Itinerary"
              onChange={(e) => {
                setitineraryDays(e.target.value);
              }}
            ></Input>
            <br />

            <Label for="ItineraryDescription">Itinerary Description</Label>
            <br />
            <Input
              type="text"
              name="ItineraryDescription"
              placeholder="Enter Itinerary Description"
              onChange={(e) => {
                setitineraryDesc(e.target.value);
              }}
            ></Input>
            <br />
            <div className="form-group">
              <Label htmlFor="ItineraryImage">Itinerary Image</Label>
              <br />
              <Input
                type="file"
                filename="itineraryImage"
                accept="image/*"
                className="form-control-file"
                onChange={onChangeFile}
              ></Input>
              <br />
            </div>

            <Label htmlFor="ItineraryCoverImage">Image for Card</Label>
            <br />
            <Input
              type="file"
              filename="itineraryCoverImage"
              accept="image/*"
              className="form-control-file"
              onChange={onChangeFile2}
            />
            <br />

            <Label for="ItineraryClass">Select Itinerary Class</Label>
            <br />
            <Input
              type="select"
              name="ItineraryClass"
              onChange={(e) => {
                setitineraryClass(e.target.value);
              }}
            >
              <option>Superior</option>
              <option>Standard</option>
            </Input>

            <Label for="ItineraryPriceA">Itinerary Price for Adults</Label>
            <br />
            <Input
              type="number"
              name="ItineraryPriceA"
              placeholder="Enter Itinerary Price for Adults"
              onChange={(e) => {
                setitineraryPriceAdult(e.target.value);
              }}
            />

            <Label for="ItineraryPriceC">Itinerary Price for Children</Label>
            <br />
            <Input
              type="number"
              name="ItineraryPriceC"
              placeholder="Enter Itinerary Price for Children"
              onChange={(e) => {
                setitineraryPriceChild(e.target.value);
              }}
            />

            <Button
              color="primary"
              type="submit"
              style={{ float: "right", margin: "5px" }}
            >
              Add Itinerary
            </Button>
          </form>
        </div>
      </div>
    </>
  );
}

export default AddItinerary;

Node.js编码(路由添加条目)

const router = require("express").Router();
const { json } = require("express");
const multer = require("multer");
let Itinerary = require("../models/Itineraries");

//Creating storage to add image files

const storage = multer.diskStorage({
  destination: (req, file, callback) => {
    callback(null, "./images/");
  },
  filename: (req, file, callback) => {
    callback(null, file.originalname);
  },
});

const upload = multer({ storage: storage });

//Adding Itinerary
router.post(
  "/add", upload.fields([
    { name: "itineraryImage", maxCount: 1 },
    { name: "itineraryCoverImage", maxCount: 1 },
  ]),
  (req, res) => {
    const newItinerary = new Itinerary({
      itineraryId: req.body.itineraryId,
      itineraryDays: req.body.itineraryDays,
      itineraryName: req.body.itineraryName,
      itineraryDesc: req.body.itineraryDesc,
      itineraryImage: req.file.originalname,
      itineraryCoverImage: req.file.originalname,
      itineraryClass: req.body.itineraryClass,
      itineraryPriceAdult: req.body.itineraryPriceAdult,
      itineraryPriceChild: req.body.itineraryPriceChild,
    });

    newItinerary
      .save()
      .then(() => {
        res.json("Itinerary Added");
      })
      .catch((err) => {
        console.log(err);
      });
  }
);

我很抱歉这么长,但我真的需要帮助。 非常感谢你! (下面是完整的错误)

TypeError: Cannot read property 'originalname' of undefined
    at E:\SLIITndYearnd_Semester\Backend_WonderLanka\WonderLanka_Backend\routes\itineraries.js:32:35
    at Layer.handle [as handle_request] (E:\SLIITndYearnd_Semester\Backend_WonderLanka\WonderLanka_Backend\node_modules\express\lib\router\layer.js:95:5)
    at next (E:\SLIITndYearnd_Semester\Backend_WonderLanka\WonderLanka_Backend\node_modules\express\lib\router\route.js:137:13)
    at Immediate.<anonymous> (E:\SLIITndYearnd_Semester\Backend_WonderLanka\WonderLanka_Backend\node_modules\multer\lib\make-middleware.js:53:37)        
    at processImmediate (internal/timers.js:466:21)
TypeError: Cannot read property 'originalname' of undefined
    at E:\SLIITndYearnd_Semester\Backend_WonderLanka\WonderLanka_Backend\routes\itineraries.js:32:35
    at Layer.handle [as handle_request] (E:\SLIITndYearnd_Semester\Backend_WonderLanka\WonderLanka_Backend\node_modules\express\lib\router\layer.js:95:5)
    at next (E:\SLIITndYearnd_Semester\Backend_WonderLanka\WonderLanka_Backend\node_modules\express\lib\router\route.js:137:13)
    at Immediate.<anonymous> (E:\SLIITndYearnd_Semester\Backend_WonderLanka\WonderLanka_Backend\node_modules\multer\lib\make-middleware.js:53:37)
    at processImmediate (internal/timers.js:466:21)

要访问有关已上传文件的信息,您必须使用 req.files,然后访问每个单独的文件。

    itineraryImage : req.files.itineraryImage[0].originalname,
    itineraryCoverImage : req.files.itineraryCoverImage[0].originalname,

此外,您必须在 axios 中设置内容类型 post reaquest

    axios.post("http://localhost:8070/itineraries/add" , formData, {headers: {'Content-Type': 'multipart/form-data'}}).then(()=>{
        alert("Itinerary Addded");
        window.location.reload();
    }).catch((err) =>{
        console.log(formData);
        console.log(err);
    })