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

Mongoose所有必填字段触发验证错误问题求助

Mongoose User Schema 必填字段全触发验证错误排查

问题场景

已定义Mongoose的User Schema,但通过API调用控制器创建新用户时,所有必填字段均触发必填项验证错误,尽管请求体中已完整传入所有字段。

User Schema 定义

const userSchema = new mongoose.Schema({
    name: {
        type: String,
        required: [true, '请输入用户名']
    },

    email: {
        type: String,
        required: [true, '请输入有效的邮箱'],
        unique : true,
        lowercase: true,
        validator: [validator.isEmail, '请提供有效的邮箱']
    },
    password: {
        type: String,
        required: [true, '请设置账户密码'],
        minlength: 6
    },

    passwordConfirm: {
        type: String,
        required: [true, '请确认密码']
    }
})

const User = mongoose.model('User', userSchema)

API 请求体(JSON)

{
    "name": "user1",
    "email": "user1@gmail.com",
    "password": "pass1234",
    "passwordConfirm": "pass1234"
}

控制器代码

exports.signup = async (req, res, next) => {
    try {
        const newUser = await User.create(req.body)
        console.log('in the newUser');
        res.status(201)
           .json({
            status: 'success',
            data: {
                user: newUser
            } 
            
        }) 

    }catch (err){
        res.status(400).json({
            status: 'fail',
            message: err
        })
    }
}

Postman 返回的错误信息

{
    "status": "fail",
    "message": {
        "errors": {
            "passwordConfirm": {
                "name": "ValidatorError",
                "message": "请确认密码",
                "properties": {
                    "message": "请确认密码",
                    "type": "required",
                    "path": "passwordConfirm"
                },
                "kind": "required",
                "path": "passwordConfirm"
            },
            "password": {
                "name": "ValidatorError",
                "message": "请设置账户密码",
                "properties": {
                    "message": "请设置账户密码",
                    "type": "required",
                    "path": "password"
                },
                "kind": "required",
                "path": "password"
            },
            "email": {
                "name": "ValidatorError",
                "message": "请输入有效的邮箱",
                "properties": {
                    "message": "请输入有效的邮箱",
                    "type": "required",
                    "path": "email"
                },
                "kind": "required",
                "path": "email"
            },
            "name": {
                "name": "ValidatorError",
                "message": "请输入用户名",
                "properties": {
                    "message": "请输入用户名",
                    "type": "required",
                    "path": "name"
                },
                "kind": "required",
                "path": "name"
            }
        },
        "_message": "用户验证失败",
        "name": "ValidationError",
        "message": "用户验证失败: passwordConfirm: 请确认密码, password: 请设置账户密码, email: 请输入有效的邮箱, name: 请输入用户名"
    }
}

排查与解决步骤

  • 添加JSON解析中间件:确保Express应用中配置了express.json(),否则服务器无法解析JSON请求体,req.body会是空对象,导致Mongoose判定所有字段缺失:
    const express = require('express');
    const app = express();
    
    // 必须添加此中间件
    app.use(express.json());
    
  • 修正Schema验证器拼写错误:email字段的验证属性名写错了,应改为validate而非validator,错误的属性名会导致验证逻辑异常:
    email: {
        type: String,
        required: [true, '请输入有效的邮箱'],
        unique : true,
        lowercase: true,
        // 修正为 validate
        validate: [validator.isEmail, '请提供有效的邮箱']
    },
    
  • 验证请求发送规范:在Postman中确认请求方法为POST、请求头Content-Type设为application/json、请求体JSON格式无语法错误。
  • 调试请求体内容:在控制器中打印req.body,确认服务器是否正确接收到参数:
    exports.signup = async (req, res, next) => {
        try {
            console.log('Received request body:', req.body);
            const newUser = await User.create(req.body)
            // 其他代码
        } catch (err) {
            // 错误处理
        }
    }
    

内容的提问来源于stack exchange,提问作者Meherab Hassan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:05:27