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

如何解决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 Name is 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:45:54