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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 08:29:55