使用React.js发送的FormData在转到Express.js后端时变为空



我正在创建一个图书库管理CRUD,我正在使用Reactv18。我很难将数据添加到我的mongdb图谱中,因为每当我通过Redux将formData传递给axios.post时,我在后端控制器上总是得到空的req.body

然而,当我使用poster通过表单数据将数据添加到数据库时,不会发生这种情况。我的登录表单也使用axios.post,使用axios.get的书单也很好,书的crud是唯一不起作用的。

这是我的bookCreate.js:

const BookCreate = () => {
const [title, setTitle] = useState('')
const [responsibility, setResponsibility] = useState('')
const [uniform_title, setUniform_title] = useState('')
const [parallel_title, setParallel_title] = useState('')
const [main_author, setMain_author] = useState('')
const [other_author, setOther_author] = useState('')
const [contributors, setContributors] = useState('')
const [corp_author, setCorp_author] = useState('')
const [placePub, setPlacePub] = useState('')
const [publisher, setPublisher] = useState('')
const [yearPub, setYearPub] = useState('')
...
const submitHandler = (e) => {
e.preventDefault();
const formData = new FormData();
formData.set('title', title);
formData.set('responsibility', responsibility);
formData.set('uniform_title', uniform_title);
formData.set('parallel_title', parallel_title);
formData.set('main_author', main_author);
formData.set('other_author', other_author);
formData.set('contributors', contributors);
formData.set('corp_author', corp_author);
formData.set('placePub', placePub);
formData.set('publisher', publisher);
formData.set('yearPub', yearPub);
dispatch(newBooks(formData))
}
return (

<Fragment>
<MetaData title={'TUP-T Online Library - Admin'} />
{/*<div className="row">*/}
<SideNavbarAdmin/>
<div></div>
<div className="dashboard-content">
<div className="dashboard-page">
<div className="dashboard-header">
<h1>Add Book</h1>
</div> 
<div className="dashboard-body">
<form className="" onSubmit={submitHandler} encType='multipart/form-data'>
<div className="row g-3">
<div className="col md-6">
<div className="form-group">
<label htmlFor="title_field">Title</label>
<input
type="text"
id="title_field"
className="form-control"
name='title'
value={title}
onChange={(e) => setTitle(e.target.value)}
/>
</div>
...
}

这是bookAction.js:

export const newBooks = (bookData) => async (dispatch) => {
try {
dispatch({ type: NEW_BOOK_REQUEST })
const config = {
headers: {
"Content-Type": "multipart/form-data"
// "Content-Type": "application/json"
}
}
// for(var pair of bookData.entries()) {
//    console.log(pair[0]+ ', '+ pair[1]); 
// }
const { data } = await axios.post('/api/v1/book/new', bookData, config)
dispatch({
type: NEW_BOOK_SUCCESS,
payload: data
})
} catch (error) {
dispatch({
type: NEW_BOOK_FAIL,
payload: error.response.data.message
})
}
}

这是bookController.js:

exports.createBook = async (req, res, next) => {
console.log(req.body);
}

我的app.js在后端:

const express = require("express");
const app = express();
const cookieParser = require("cookie-parser");
const errorMiddleware = require("./middlewares/errors");
app.use(express.json());
app.use(cookieParser());
app.use(errorMiddleware);
app.use(express.urlencoded({ extended: true }));
const book = require("./routes/book");
const auth = require("./routes/auth");
app.use("/api/v1", book);
app.use("/api/v1", auth);
app.use(errorMiddleware);
module.exports = app;

FormData发送multipart/form-data,因此您在app.js中使用的解析器将无法工作。常用且简单的方法是使用multer。首先安装:

npm install --save multer

然后,在放置urlencodedcookieParser的位置使用以下内容:

const multer = require('multer');
const upload = multer();
app.use(upload.none())

我使用这个upload.none()是因为你似乎没有发送任何文件。如果你是,你可以访问上面的链接,mutter会让你这样做。

此外,您还可以简化submitHandler,因为每个表单input都有一个name,通过获取所有这些状态,并简单地将formFormData()作为参数e.target:

const submitHandler = (e) => {
e.preventDefault();
const formData = new FormData(e.target);
dispatch(newBooks(formData));
};

最新更新