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为空对象。
解决步骤
- 在
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;
- 发送请求时确保请求头
Content-Type与请求体格式匹配:- JSON格式请求体对应
Content-Type: application/json - 表单格式请求体对应
Content-Type: application/x-www-form-urlencoded
- JSON格式请求体对应
添加中间件后,Express即可正确解析请求体数据,req.body能获取到提交的字段,Mongoose验证即可通过。
内容的提问来源于stack exchange,提问作者SUMIT KUMAR CHAURASIYA
相关产品推荐
相关产品推荐

