Отправка формы React

Добрый день пытаюсь отправить данные формы из реакта на сервер используя fetch, на сервере запрос обрабатываю с помощью multer, но данные не разделятся. Сам компонент CreatePage

const CreatePage = () => {
  const [newsData, setNewsData] = React.useState({});

  const submit = (event: React.FormEvent) => {
    event.preventDefault();
    createDataNews(newsData);
  };
  return (
    <div className="input-news-form">
      <div className="row">
        <form id="form" onSubmit={submit}>
          <input
            type="text"
            placeholder="input title here"
            id="title"
            name="title"
            onChange={(e: React.FormEvent<HTMLInputElement>) =>
              setNewsData({
                ...newsData,
                title: (e.target as HTMLInputElement).value,
              })
            }
          ></input>
          <input
            type="text"
            placeholder="input news here"
            id="news"
            name="news"
            onChange={(e: React.FormEvent<HTMLInputElement>) =>
              setNewsData({
                ...newsData,
                news: (e.target as HTMLInputElement).value,
              })
            }
          ></input>
          <input
            type="file"
            name="selectedFile"
            id="selectedFile"
            onChange={(e: any) =>
              setNewsData({
                ...newsData,
                selectedFile: e.target.files[0],
              })
            }
          ></input>
          <button type="submit" value="Submit">
            Submit
          </button>
        </form>
      </div>
    </div>
  );
};

export default CreatePage;

API

const URI: string = "http://localhost:5000";

export const createDataNews = (news: any) => {
  try {
    const request = async () => {
      const res = await fetch(`${URI}/news/addnews`, {
        headers: { "Content-Type": "application/x-www-form-urlencoded" },
        method: "POST",
        body: JSON.stringify(news),
      });
      const data = await res.json();
      if (!res.ok) {
        throw new Error(data);
      }
    };
    if (news.news && news.selectedFile && news.title) {
      request();
    }
  } catch (e) {
    return e;
  }
};

обработчик на сервере


router.post(
  `/addnews`,
  multerUploads,
  async (req: Request, res: Response): Promise<void> => {
    try {
      const news: INewsSchema = req.body;
      let buf = req.file.buffer.toString("base64");
     
      cloudinary.v2.uploader.upload(
        "data:image/png;base64," + buf,
        {
          folder: "news",
        },
        async (req: any, response: any) => {
          console.log(response);
          const newNews: INewsSchema = new NewsPost({
            ...news,
            selectedFile: response.url,
          });
          await newNews.save();
        }
      );
      res.status(201).json(`post added`);
    } catch (e) {
      res.status(404).json(e.message);
    }
  }
);

что самой интересное если форму отправлять из postman то все долетает без проблем


Ответы (1 шт):

Автор решения: oldsav

Переписал компонент подобным образом теперь все работает, спасибо за помощь

const CreatePage = () => {
  const [title, setTitle] = React.useState(``);
  const [news, setNews] = React.useState(``);
  const [selectedFile, setFile] = React.useState();

  const clear = () => {
    setTitle(``);
    setNews(``);
  };

  let handleUploadFile = (event: React.SyntheticEvent) => {
    event.preventDefault();
    const data = new FormData();
    data.append("selectedFile", selectedFile!);
    data.append("title", title);
    data.append("news", news);
    createDataNews(data);
    clear();
  };
  return (
    <div className="input-news-form">
      <div className="row">
        <form className="col s12" id="form" onSubmit={handleUploadFile}>
          <input
            type="text"
            placeholder="input title here"
            id="title"
            name="title"
            value={title}
            onChange={(e: React.FormEvent<HTMLInputElement>) =>
              setTitle((e.target as HTMLInputElement).value)
            }
          ></input>
          <input
            type="text"
            placeholder="input news here"
            id="news"
            name="news"
            value={news}
            onChange={(e: React.FormEvent<HTMLInputElement>) =>
              setNews((e.target as HTMLInputElement).value)
            }
          ></input>
          <input
            type="file"
            name="selectedFile"
            id="selectedFile"
            onChange={(e: any) => setFile(e.target.files[0])}
          ></input>
          <button
            className="btn waves-effect waves-light"
            type="submit"
            value="Submit"
          >
            Submit
          </button>
        </form>
      </div>
    </div>
  );
};

export default CreatePage;

АПИ

const URI: string = "http://localhost:5000";

export const createDataNews = async (news: any) => {
  try {
    const request = async () => {
      const res = await fetch(`${URI}/news/addnews`, {
        credentials: "same-origin",
        method: "POST",
        body: news,
      });
      const data = await res.json();
      if (!res.ok) {
        throw new Error(data);
      }
    };
    if (news) {
      request();
    }
  } catch (e) {
    return e;
  }
};

→ Ссылка