Node.js POST请求异常排查:候选人信息无法写入MongoDB
Node.js+Express POST请求字段未存入MongoDB排查修复
问题现象
提交候选人信息时,MongoDB Atlas仅生成_id与updated_at字段,name、email、num字段未被正确存储,数据库连接正常。
核心原因
表单设置了enctype="multipart/form-data",但当前表单无文件上传需求,且Express默认的express.urlencoded中间件无法解析该编码格式的请求,导致req.body为空。MongoDB会忽略未定义的字段,仅生成默认的_id和timestamps相关字段。
修复方案
1. 修改表单编码设置
移除addCandidate.ejs表单中的enctype="multipart/form-data"属性,使用默认的application/x-www-form-urlencoded编码,该编码可被已配置的express.urlencoded({ extended: true })中间件正常解析。
修改后的addCandidate.ejs代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <h1>Add Candidate Here</h1> <form action="/candidate" method="post" style=" display: flex; flex-direction: column; justify-content: center; width: 50%; gap: 20px; " > <label for="">Name: </label> <input type="text" name="name" placeholder="Candidate Name" /> <label for="">Email: </label> <input type="email" name="email" placeholder="Candidate Email" /> <label for="">Number: </label> <input type="number" name="num" placeholder="Phone no." /> <button type="submit">Add</button> </form> </body> </html>
2. (可选)添加请求参数校验
在addCandidate控制器中增加参数校验,提前拦截空数据请求,便于调试:
const addCandidate = (req, res) => { console.log(req.body); // 现在能正确输出表单提交的数据 if (!req.body.name || !req.body.email || !req.body.num) { return res.status(400).send("请填写完整的候选人信息"); } const candidate = new Candidate({ name: req.body.name, email: req.body.email, num: req.body.num }); candidate.save() .then(() => { res.redirect("/dashboard"); }) .catch((err) => { res.status(500).send(err.message + " Sorry, something went wrong."); }); };
内容的提问来源于stack exchange,提问作者AVI ____
相关产品推荐
相关产品推荐

