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
相关产品推荐
相关产品推荐

