You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js Mongoose实现博客编辑功能时表单提交获取请求值为undefined如何解决

问题原因及解决方法

1. 表单编码类型与解析中间件不匹配

你提交表单时用了enctype="multipart/form-data"编码格式,这类格式用于传输文件数据,但Express 原生的express.urlencoded()、express.json()中间件不支持解析该格式的请求体,所以req.body下的所有字段都会返回undefined。

解决方法:

安装Express官方推荐的form-data解析中间件multer:

  • 第一步安装依赖:
npm install multer
  • 第二步引入并配置multer:
const multer = require('multer');
// 自定义文件存储规则,可根据自身需求调整
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'public/uploads/') // 需提前创建该存储文件夹
  },
  filename: function (req, file, cb) {
    cb(null, Date.now() + '-' + file.originalname)
  }
})
const upload = multer({ storage: storage })
  • 第三步调整/editDone路由配置,引入multer中间件:
// single参数对应表单内文件上传控件的name属性值myFile
app.post('/editDone', upload.single('myFile'), (req,res)=>{
  const newTitle = req.body.tit;
  const newDesc = req.body.des;
  // 未上传新文件时默认使用原有图片地址
  const newFile = req.file ? req.file.filename : req.body.oldImg; 
  const edit2Id = req.body.btnIdd;
  console.log(newTitle)

  Blogdata.findOneAndUpdate({_id: edit2Id}, {title: newTitle, description: newDesc, img: newFile}, (err)=>{
      if(err){
          console.log("failed to update")
      }else{
          console.log("Updated Successfully")
          res.redirect('/') // 补充跳转逻辑,避免请求挂起
      }
  })
})

2. EJS模板问题修复

你当前的EJS代码存在三个小问题,也会影响正常提交:

  • input的value属性末尾多了冗余空格,会导致提交的内容末尾自带多余空格
  • 缺少原有图片地址的隐藏域,用户未上传新图片时无法复用原有图片
  • 缺少</form>闭合标签

修正后的EJS代码如下:

<%- include("partials/head") %> 

<form action="/editDone" method="POST" enctype="multipart/form-data">
<!-- 新增隐藏域存储原有图片地址 -->
<input type="hidden" name="oldImg" value="<%= data.img %>">
<div class="form-group-login">
    <label for="title">Title</label>
    <input type="text" name="tit" id="title" value="<%= data.title %>">
</div>
<div class="form-group-login">
    <label for="desc">Description</label>
    <input type="text" name="des"  id="desc" value="<%= data.description %>">
</div>
<div class="form-group-login">
    <input type="file" name="myFile" class="fileForm">
</div>
<button type="submit" class="btn-form-login" name="btnIdd" value="<%=data._id %>">Submit</button>
</form>

3. 全局中间件检查

如果项目中没有配置普通POST请求的解析中间件,需要在代码顶部补充以下配置,用于处理非文件上传类的POST请求:

app.use(express.urlencoded({ extended: true }))
app.use(express.json())

内容的提问来源于stack exchange,提问作者iTs iCreazYY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 14:30:02