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

Mongoose验证错误:提交必填字段仍提示Path is required

Mongoose保存Product时出现必填字段验证失败问题

尝试使用Mongoose向MongoDB保存新Product文档,提交所有必填字段后仍收到ValidationError,提示核心必填字段未提供。以下是相关代码及错误信息:

相关代码

productModel.js

const mongoose = require("mongoose");
const Validator = require("Validator");

const productSchema = new mongoose.Schema({
  name: {
    type: String,
    required:[true,"Please Enter Your Name"],
    trim: true
  },
  description: {
    type: String,
    required: [true,"Please Enter Product Description"],
  },
  price: {
    type: Number,
    required: [true,"Please Enter Product Price"],
    maxLength: [8, "Price cannot exceed 8 characters"],
  },
  ratings: {
    type: Number,
    default: 0,
  },
  images: [
    {
      public_id: {
        type: String,
        required: true,
      },
      url: {
        type: String,
        required: true,
      },
    },
  ],
  category: {
    type: String,
    required: [true,"Please Enter Product Category"],
  },
  Stock: {
    type: Number,
    required: [true, "Please Enter product Stock"],
    maxLength: [4, "Stock cannot exceed 4 characters"],
    default: 1,
  },
  numOfReviews: {
    type: Number,
    default: 0,
  },
  reviews: [
    {
      user: {
        type: mongoose.Schema.ObjectId,
        ref: "User",
        required: true,
      },
      name: {
        type: String,
        required: true,
      },
      rating: {
        type: Number,
        required: true,
      },
      comment: {
        type: String,
        required: true,
      },
    },
  ],
  createdAt: {
    type: Date,
    default: Date.now,
  },
});

productRoute.js

const express=require("express");
const { getAllProducts,createProduct } = require("../controllers/productController");

const router=express.Router();

router.route("/products").get(getAllProducts);
router.route("/product/new").post(createProduct);

module.exports=router

server.js

const app = require("./app");
const dotenv = require("dotenv");
const connectDatabase=require("./config/database");

//config
dotenv.config({path:"backend/config/config.env"});

//connecting to database
connectDatabase();

app.listen(process.env.PORT,()=>{
    console.log('server is working on https://localhost:${process.env.PORT}')
});

productController.js

const Product=require("../models/productModel");

//Create Product
exports.createProduct=async(req,res,next)=>{
     const product= await Product.create(req.body);

     res.status(201).json({
        success:true,
        product,
     });
}

exports.getAllProducts = (req,res)=>{
    res.status(200).json({message:"Route is working fine"})
}

database.js

const mongoose=require("mongoose");

const connectDatabase =()=>{
    mongoose.connect(process.env.DB_URI,{useNewUrlParser:true,useUnifiedTopology:true,
    /*useCreateIndex:true*/}).then((data)=>{
            console.log(`Mongodb connected with server:${data.connection.host}`);
        }).catch((err)=>{
            console.log(err);
        })
}
module.exports =connectDatabase;

错误信息

this.$__.validationError = new ValidationError(this);
^

ValidationError: Product validation failed: category: Please Enter Product Category, price: Please Enter Product Price, description: Please Enter Product Description, name: Please Enter Your Name
at model.Document.invalidate (C:\Users\HP\OneDrive\Desktop\E Commerce\node_modules\mongoose\lib\document.js:3097:32)
at C:\Users\HP\OneDrive\Desktop\E Commerce\node_modules\mongoose\lib\document.js:2885:17
at C:\Users\HP\OneDrive\Desktop\E Commerce\node_modules\mongoose\lib\schematype.js:1349:9
at processTicksAndRejections (node:internal/process/task_queues:78:11) {
errors: {
category: ValidatorError: Please Enter Product Category
at validate (C:\Users\HP\OneDrive\Desktop\E Commerce\node_modules\mongoose\lib\schematype.js:1346:13)
at SchemaString.SchemaType.doValidate (C:\Users\HP\OneDrive\Desktop\E Commerce\node_modules\mongoose\lib\schematype.js:1330:7)
at C:\Users\HP\OneDrive\Desktop\E Commerce\node_modules\mongoose\lib\document.js:2877:18
at processTicksAndRejections (node:internal/process/task_queues:78:11) {
properties: {
validator: [Function (anonymous)],
message: 'Please Enter Product Category',
type: 'required',
path: 'category',
value: undefined
},
kind: 'required',
path: 'category',
value: undefined,
reason: undefined,
[Symbol(mongoose:validatorError)]: true
},
price: ValidatorError: Please Enter Product Price
at validate (C:\Users\HP\OneDrive\Desktop\E Commerce\node_modules\mongoose\lib\schematype.js:1346:13)
at SchemaNumber.SchemaType.doValidate (C:\Users\HP\OneDrive\Desktop\E Commerce\node_modules\mongoose\lib\schematype.js:1330:7)
at C:\Users\HP\OneDrive\Desktop\E Commerce\node_modules\mongoose\lib\document.js:2877:18
at processTicksAndRejections (node:internal/process/task_queues:78:11) {
properties: {
validator: [Function (anonymous)],
message: 'Please Enter Product Price',
type: 'required',
path: 'price',
value: undefined
},
kind: 'required',
path: 'price',
value: undefined,
reason: undefined,
[Symbol(mongoose:validatorError)]: true
},
description: ValidatorError: Please Enter Product Description
at validate (C:\Users\HP\OneDrive\Desktop\E Commerce\node_modules\mongoose\lib\schematype.js:1346:13)
at SchemaString.SchemaType.doValidate (C:\Users\HP\OneDrive\Desktop\E Commerce\node_modules\mongoose\lib\schematype.js:1330:7)
at C:\Users\HP\OneDrive\Desktop\E Commerce\node_modules\mongoose\lib\document.js:2877:18
at processTicksAndRejections (node:internal/process/task_queues:78:11) {
properties: {
validator: [Function (anonymous)],
message: 'Please Enter Product Description',
type: 'required',
path: 'description',
value: undefined
},
kind: 'required',
path: 'description',
value: undefined,
reason: undefined,
[Symbol(mongoose:validatorError)]: true
},
name: ValidatorError: Please Enter Your Name
at validate (C:\Users\HP\OneDrive\Desktop\E Commerce\node_modules\mongoose\lib\schematype.js:1346:13)
at SchemaString.SchemaType.doValidate (C:\Users\HP\OneDrive\Desktop\E Commerce\node_modules\mongoose\lib\schematype.js:1330:7)
at C:\Users\HP\OneDrive\Desktop\E Commerce\node_modules\mongoose\lib\document.js:2877:18
at processTicksAndRejections (node:internal/process/task_queues:78:11) {
properties: {
validator: [Function (anonymous)],
message: 'Please Enter Your Name',
type: 'required',
path: 'name',
value: undefined
},
kind: 'required',
path: 'name',
value: undefined,
reason: undefined,
[Symbol(mongoose:validatorError)]: true
}
},
_message: 'Product validation failed'
}

问题分析与解决方法

从错误信息可见,所有必填字段的value均为undefined,说明Express应用未配置请求体解析中间件,导致req.body为空对象。

解决步骤

  1. 在app.js中添加请求体解析中间件:
const express = require('express');
const app = express();

// 解析JSON格式请求体
app.use(express.json());
// 解析表单格式请求体(若需处理表单提交则添加)
app.use(express.urlencoded({ extended: true }));

// 挂载路由
const productRoutes = require('./routes/productRoute');
app.use('/api', productRoutes);

module.exports = app;
  1. 发送请求时确保请求头Content-Type与请求体格式匹配:
    • JSON格式请求体对应Content-Type: application/json
    • 表单格式请求体对应Content-Type: application/x-www-form-urlencoded

添加中间件后,Express即可正确解析请求体数据,req.body能获取到提交的字段,Mongoose验证即可通过。


内容的提问来源于stack exchange,提问作者SUMIT KUMAR CHAURASIYA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:05:32