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

Mongoose Post请求缺少必填字段仍能创建用户,求排查原因

问题排查与修复

你遇到的问题是因为代码存在多处关键错误,导致mongoose的必填字段校验未生效,具体问题和修复方案如下:

核心错误点

  • Schema必填参数拼写错误:mongoose中控制字段必填的参数是required,你写成了require(少了末尾的d),这直接导致必填校验逻辑完全失效,缺少字段也不会触发异常。
  • 模型字段不匹配:Schema里定义的姓名字段是fullName,但注册控制器创建User实例时,传入的是name: name,即使前端传了fullName,也不会被存入数据库;而前端没传时,因为校验失效,系统直接创建了缺少fullName的用户文档。
  • 密码变量未定义:控制器里直接使用password变量,但没有从req.body中提取该参数(应该添加const password = req.body.password),同时你的Schema里也没有定义password字段,就算加密后也无法存入数据库。

修复后的代码

修复后的User模型

const mongoose = require('mongoose')
const Schema = mongoose.Schema;
const userSchema = new Schema({
    fullName: {
        type: String,
        required: true // 修正拼写错误
    },
    email: {
        type: String,
        required: true // 修正拼写错误
    },
    password: { // 新增password字段定义
        type: String,
        required: true
    }
})

module.exports = mongoose.model('User', userSchema)

修复后的注册控制器

exports.register = (req, res, next) => {
    const email = req.body.email
    const fullName = req.body.fullName // 变量名与Schema字段保持一致
    const password = req.body.password // 新增提取密码参数

    bcrypt
        .hash(password, 12)
        .then(hashedPassword => {
            const user = new User({
                email: email,
                fullName: fullName, // 对应Schema的fullName字段
                password: hashedPassword
            })
            return user.save()
        })
        .then(createdUser => {
            res.status(201).json({ message: "用户创建成功", userData: createdUser })
        })
        .catch(err => {
            if(!err.statusCode) {
                err.statusCode = 500
            }
            next(err)
        })
}

修复后,当请求缺少fullName、email或password时,mongoose会自动抛出校验异常,阻止用户创建。

内容的提问来源于stack exchange,提问作者Sidney Sousa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 19:53:13