如何解决Node.js+MongoDB中的'Path `Name` is required' ValidatorError
解决MongoDB + Node.js中POST请求的ValidatorError(Path
Name is required)问题 问题场景
作为MongoDB和Node.js新手,在客户端发起POST请求提交表单时,遇到如下验证错误:
{"name":"ValidatorError","message":"Path
Nameis required."}
以下是相关代码:
Schema代码
import mongoose from "mongoose"; const signupTemplate = mongoose.Schema({ Name: { type: String, required: true, }, Phone: { type: Number, required: true, }, Email: { type: String, required: true, }, Password: { type: String, required: true, }, date: { type: Date, Default: Date.now, }, }); export default mongoose.model("users", signupTemplate);
路由代码
router.post("/signup", (req, res) => { const signedUpUser = new signUpTemplate({ Name: req.body.Name, Phone: req.body.Phone, Email: req.body.Email, Password: req.body.Password, }); console.log(req.body.Name); signedUpUser .save() .then((data) => { res.json(data); }) .catch((err) => { res.json(err); // console.log('you made an error'); }); // res.send("User Registered successfully"); });
表单代码
<form action="/signup" method="post"> <label for="Name">Full Name</label> <input type="text" class="form-control" id="Name" name="Name" /> <label for="Phoneno">Phone No.</label> <input type="text" class="form-control"id="Phoneno" name="Phone" /> <label for="Email">Email</label> <input type="email" class="form-control"id="Email" name="Email" /> <label for="create-password">Create Password</label> <input type="password" class="form-control"id="create-password" name="Password" /> <label for="confirm-password">Confirm Password</label> <input type="password" class="form-control"id="confirm-password" name=" Confirm-password" /> <button type="submit" class="btn">Sign Up</button> <hr> <p style="display:inline;">Or continue with</p> <a href="#"><i class="fa-brands fa-google"></i></a> <a href="#"><i class="fa-brands fa-facebook"></i></a> <a href="#"><i class="fa-brands fa-instagram"></i></a> </form>
问题原因
核心原因是Express默认未解析表单提交的application/x-www-form-urlencoded格式数据,导致req.body为空对象,进而使Mongoose Schema验证时检测到Name字段缺失,触发必填错误。
另外Schema中date字段的Default是大写D,不符合Mongoose的语法规范,会导致默认值不生效(虽然不是当前错误的直接原因,但建议修复)。
修复方案
1. 添加Express表单解析中间件
在你的Express应用入口文件(如app.js或index.js)中,路由注册之前添加以下代码,用于解析表单数据:
import express from 'express'; const app = express(); // 解析application/x-www-form-urlencoded格式的表单数据 app.use(express.urlencoded({ extended: true }));
如果使用CommonJS模块(require语法),则:
const express = require('express'); const app = express(); app.use(express.urlencoded({ extended: true }));
2. 修正Schema中的默认值语法
将Schema里date字段的Default改为小写default:
date: { type: Date, default: Date.now, // 改为小写d },
3. 验证数据接收情况
可以在路由中打印整个req.body,确认是否成功接收到表单数据:
router.post("/signup", (req, res) => { console.log('Received body:', req.body); // 新增这行 const signedUpUser = new signUpTemplate({ Name: req.body.Name, Phone: req.body.Phone, Email: req.body.Email, Password: req.body.Password, }); // ... 后续代码不变 });
如果打印出的req.body包含表单中填写的Name、Phone等字段,说明中间件配置生效。
验证修复效果
重新启动应用,提交表单后,Mongoose应该能正常接收到Name字段数据,不再触发必填验证错误。
内容的提问来源于stack exchange,提问作者Tarun gujral
相关产品推荐
相关产品推荐

