为何Mongoose前端提交必填字段时验证失败,Postman却正常?
问题:前端提交注册表单时Mongoose触发必填字段验证错误,Postman请求正常
我使用Node.js、Express.js和MongoDB以MVC架构开发用户注册系统,通过Postman提交POST请求时完全正常,但通过前端表单提交时,数据无法传递到后端,导致Mongoose触发必填字段验证错误。我已经尝试过使用bodyParser和Express自带的解析中间件,也检查了表单字段名与控制器中的对应关系,但问题仍未解决。
相关代码如下:
userModel
const mongoose = require("mongoose"); const userSchema = new mongoose.Schema({ name:{ type:String, required: true }, email:{ type:String, required: true }, mobile:{ type:String, required: true }, password:{ type:String, required: true }, is_admin:{ type:Number, required:true }, is_verified:{ type:Number, default:0 } }); module.exports = mongoose.model('User', userSchema);
userController
const User = require('../models/userModel'); const loadRegister = async(req, res) =>{ try { res.render('registration') } catch (error) { console.log(error.message) } } const insertUser = async(req, res) => { try { const user = new User({ name: req.body.name, email: req.body.email, mobile: req.body.mno, password: req.body.password, is_admin: 0 }); const userData = await user.save(); if(userData){ res.render('registration',{message:'Account created successfully!'}) } else{ res.render('registration',{message:'Cannot Create Account!'}) } } catch (error) { console.log(error.message) } } module.exports = { loadRegister, insertUser, }
userRoute
const express = require("express"); const user_route = express(); const bodyParser = require('body-parser'); user_route.set('view engine', 'ejs'); user_route.set('views', './views/users'); // user_route.use(bodyParser.json()); // user_route.use(bodyParser.urlencoded({extended:true})); user_route.use(express.json()); user_route.use(express.urlencoded({ extended: true })); const userController = require('../controllers/userController'); user_route.get('/register', userController.loadRegister); user_route.post('/register', userController.insertUser); module.exports = user_route;
registration.ejs
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Heal PTSD</title> </head> <body> <h1>User Registration Form</h1> <form action="/register" method="post" enctype="multipart/form-data"> <input type="text" name="name" placeholder="Enter Name" required> <br> <br> <input type="email" name="email" placeholder="Enter Email" required> <br> <br> <input type="text" name="mno" placeholder="Enter Mobile" required> <br> <br> <input type="password" name="password" placeholder="Enter password" required> <br> <br> <input type="submit" name="Register"> <br> <br> </form> </body> </html>
解决方案
问题出在前端表单的enctype="multipart/form-data"属性上。
步骤1:修改表单编码类型
你的表单中没有文件上传字段,不需要使用multipart/form-data编码。Express的express.urlencoded({ extended: true })中间件只能解析application/x-www-form-urlencoded类型的请求体(这是表单的默认编码类型),无法处理multipart/form-data。
修改registration.ejs中的form标签,移除enctype="multipart/form-data":
<form action="/register" method="post"> <!-- 表单内容不变 --> </form>
步骤2:验证修复效果
重启服务器后,通过前端表单提交数据,此时req.body应该能正常获取到表单字段值,Mongoose的必填字段验证也不会再触发错误。
补充说明
如果后续需要在表单中添加文件上传功能,你需要引入multer中间件来处理multipart/form-data类型的请求体,此时才能保留enctype="multipart/form-data"属性。但当前场景下,这个属性是多余的,也是导致问题的直接原因。
内容的提问来源于stack exchange,提问作者dania salman
相关产品推荐
相关产品推荐

