如何用Multer将数据存MongoDB并保存图片到本地,服务端收不到数据怎么解决
Multer接收FormData数据异常解决方案
以下是逐步排查修复的步骤:
- 检查前端请求配置
不要在全局axios拦截器或本次请求中手动设置Content-Type: application/json,当传入FormData实例时,axios会自动携带符合要求的multipart/form-data请求头并附加boundary分隔符,手动配置请求头会导致Multer无法解析请求数据。前端提交逻辑可调整为:const onSubmit=async(object) =>{ const fd = new FormData() fd.append('name', object.name) fd.append('category', object.category) fd.append('quantity', object.quantity) fd.append('price', object.price) fd.append('myFile',object.file[0], object.file[0].name) // 不要手动加Content-Type头 const response = await axios.post(`${url}/admin/add-product`,fd) } - 检查服务端存储目录配置
Multer不会自动创建目标存储文件夹,需要你手动在项目根目录创建images文件夹,同时确保该文件夹开放了写入权限,否则Multer会直接解析失败,不会进入后续控制器逻辑。 - 补充控制器数据读取逻辑
经过upload.single('myFile')中间件处理后,表单的文本字段会挂载到req.body对象,上传的文件信息会挂载到req.file对象,可按如下示例补全逻辑:export const addProduct = async (req, res)=> { try{ // 打印可验证数据是否正常接收 console.log('表单文本数据:', req.body) console.log('上传文件信息:', req.file) // 存入MongoDB逻辑示例 const product = await ProductModel.create({ ...req.body, // 将图片本地存储路径存入数据库image字段 image: req.file.path }) res.status(200).json({ code: 200, data: product, message: '添加成功' }) }catch(error) { // 服务端错误不要返回404状态码,替换为500 res.status(500).json({message:error.message}) } } - 检查路由匹配规则
如果你给当前路由实例配置了全局前缀(比如app.use('/api', route)),需要确保前端请求地址和实际路由地址匹配,否则会触发404无法进入接口逻辑。 - 检查全局中间件冲突
不要将express.json()、express.urlencoded()这类仅处理JSON/表单编码格式的中间件应用到当前上传接口,这类中间件会干扰Multer解析FormData格式的请求。
内容的提问来源于stack exchange,提问作者ASIF KAIF
相关产品推荐
相关产品推荐

