Невозможно сохранить данные формы в базе данных Atlas с помощью панели администратора

Я пытаюсь следовать этому руководству по веб-сайту заказа еды, будучи новичком, и при создании панели администратора я не могу добавить продукт, который хочу отправить через форму, в базу данных mongoose atlas, для которой я настроил это.

Вот компонент для добавления продукта питания;

import React, { useState } from "react";
import "./Add.css";
import { assets } from "../../assets/assets";
import axios from "axios"
import { toast } from "react-toastify";

const Add = () => {

  const url = "http://localhost:5173";
  const [image, setImage] = useState(false);
  const [data, setData] = useState({
    name:"",
    description:"",
    price:"",
    category:"Salad"
  })

  const onChangeHandler = (event) => {
    const name = event.target.name;
    const value = event.target.value;
    setData(data =>({...data, [name]:value}))
  }
  
  const onSubmitHandler = async (event) => {
    event.preventDefault();
    const formData = new FormData();
    formData.append("name", data.name)
    formData.append("description", data.description)
    formData.append("price", Number(data.price))
    formData.append("category", data.category)
    formData.append("image", image)
    const response = await axios.post(`${url}/api/food/add`, formData);
    
    if (response.data.success) {
      setData({
        name:"",
        description:"",
        price:"",
        category:"Salad"
      })
      setImage(false)
      toast.success(response.data.message)
    }
    else {
      toast.error(response.data.message)
    }
  } 

  return (
    <div className = "add">
      <form className = "flex-col" onSubmit = {onSubmitHandler}>
        <div className = "add-img-upload flex-col">
          <p>Upload Image</p>
          <label htmlFor = "image">
            <img src = {image?URL.createObjectURL(image):assets.upload_area} alt = "" />
          </label>
          <input onClick = {(e)=>setImage(e.target.files[0])} type = "file" id = "image" hidden required />
        </div>
        <div className = "add-product-name flex-col">
          <p>Product name</p>
          <input onChange = {onChangeHandler} value = {data.name} type = "text" name = "name" placeholder = "Type here" />
        </div>
        <div className = "add-product-description flex-col">
          <p>Product description</p>
          <textarea onChange = {onChangeHandler} value = {data.description}
            name = "description"
            rows = "6"
            placeholder = "Write content here"
            required
          ></textarea>
        </div>
        <div className = "add-category-price">
          <div className = "add-category flex-col">
            <p>Product category</p>
            <select onChange = {onChangeHandler} name = "category">
              <option value = "Salad">Salad</option>
              <option value = "Rolls">Rolls</option>
              <option value = "Deserts">Deserts</option>
              <option value = "Sandwich">Sandwich</option>
              <option value = "Cake">Cake</option>
              <option value = "Pure Veg">Pure Veg</option>
              <option value = "Pasta">Pasta</option>
              <option value = "Noodles">Noodles</option>
            </select>
          </div>
          <div className = "add-price flex-col">
            <p>Product price</p>
            <input onChange = {onChangeHandler} value = {data.price} type = "Number" name = "price" placeholder = "$20" />
          </div>
        </div>
        <button type = "submit" className = "add-btn">ADD</button>
      </form>
    </div>
  );
};

export default Add;

Вот репозиторий GitHub того, что я сделал на данный момент, если кто-то хочет взглянуть на бэкэнд.

Я думаю, что может возникнуть проблема с подключением администратора к серверной части или только с администратором, потому что, когда я попытался добавить продукт в базу данных с помощью Thunder Client, это сработало. Я также понятия не имею, в чем может заключаться ошибка, если она как-то связана с серверной частью.

Обновлено: при выполнении проверки компонента Add.jsx отображаются следующие ошибки;

No routes matched location "/" 
warning @ react-router-dom

Когда я пытаюсь заполнить форму, возникают ошибки;

POST http://localhost:3000/api/food/add net::ERR_CONNECTION_RESET

и

AxiosError {message: 'Network Error', name: 'AxiosError', code: 'ERR_NETWORK', config: {…}, request: XMLHttpRequest, …}
code
: 
"ERR_NETWORK"

Вы используете FormData(), поэтому он будет отправлен на ваш сервер как multipart/form-data. Однако экспресс не может анализировать multipart/form-data без чего-то вроде multer. Ваше промежуточное ПО express.json() анализирует только данные в формате JSON. Кроме того, ваше имя пользователя и пароль указаны на GitHub в строке подключения mongoose. Я бы посоветовал вам немедленно сменить его на Атлас.

jQueeny 07.06.2024 15:47

@jQueeny Спасибо, я это упустил из виду. Сейчас я изменил учетные данные, но это была своего рода одноразовая учетная запись в Атласе, которую я создал, чтобы чему-то научиться. Ничего больше не связано, но все равно спасибо! Кроме того, я использую multer в компоненте foodRoute на серверной стороне, это не поможет? Предполагается загружать входные данные в папку uploads.

Vaishnavi 07.06.2024 18:13

Извините, да, я вижу там Мультера. Я искал в твоем контроллере. Изображение загружено успешно, но документ не сохраняется в Atlas? В этом проблема? В этом случае await food.save(); выдаст ошибку, которая будет обнаружена и выведена на консоль в вашем console.info(error).

jQueeny 07.06.2024 18:39

Да, вот что происходит! Но я не получаю никаких ошибок на этой странице.

Vaishnavi 07.06.2024 19:14

Получаете ли вы ответ {success: true, message:"Food Added"}, если он не выдает ошибку?

jQueeny 07.06.2024 23:07

Вовсе нет, как будто кнопка добавления ничего не делает.

Vaishnavi 08.06.2024 07:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я починил это! Оказывается, я использовал onClick для раздела загрузки изображений в строке 56 и onChange для всего остального.

Изображение все еще загружалось, но formData не сохранялось в базе данных Атласа. Вместо этого я изменил его на onChange, и теперь он работает. Полученный фрагмент кода:

<input onChange = {(e)=>setImage(e.target.files[0])} type = "file" id = "image" hidden />

Другие вопросы по теме