Отправка формы 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;
}
};