Mongoose所有必填字段触发验证错误问题求助
Mongoose User Schema 必填字段全触发验证错误排查
问题场景
已定义Mongoose的User Schema,但通过API调用控制器创建新用户时,所有必填字段均触发必填项验证错误,尽管请求体中已完整传入所有字段。
User Schema 定义
const userSchema = new mongoose.Schema({ name: { type: String, required: [true, '请输入用户名'] }, email: { type: String, required: [true, '请输入有效的邮箱'], unique : true, lowercase: true, validator: [validator.isEmail, '请提供有效的邮箱'] }, password: { type: String, required: [true, '请设置账户密码'], minlength: 6 }, passwordConfirm: { type: String, required: [true, '请确认密码'] } }) const User = mongoose.model('User', userSchema)
API 请求体(JSON)
{ "name": "user1", "email": "user1@gmail.com", "password": "pass1234", "passwordConfirm": "pass1234" }
控制器代码
exports.signup = async (req, res, next) => { try { const newUser = await User.create(req.body) console.log('in the newUser'); res.status(201) .json({ status: 'success', data: { user: newUser } }) }catch (err){ res.status(400).json({ status: 'fail', message: err }) } }
Postman 返回的错误信息
{ "status": "fail", "message": { "errors": { "passwordConfirm": { "name": "ValidatorError", "message": "请确认密码", "properties": { "message": "请确认密码", "type": "required", "path": "passwordConfirm" }, "kind": "required", "path": "passwordConfirm" }, "password": { "name": "ValidatorError", "message": "请设置账户密码", "properties": { "message": "请设置账户密码", "type": "required", "path": "password" }, "kind": "required", "path": "password" }, "email": { "name": "ValidatorError", "message": "请输入有效的邮箱", "properties": { "message": "请输入有效的邮箱", "type": "required", "path": "email" }, "kind": "required", "path": "email" }, "name": { "name": "ValidatorError", "message": "请输入用户名", "properties": { "message": "请输入用户名", "type": "required", "path": "name" }, "kind": "required", "path": "name" } }, "_message": "用户验证失败", "name": "ValidationError", "message": "用户验证失败: passwordConfirm: 请确认密码, password: 请设置账户密码, email: 请输入有效的邮箱, name: 请输入用户名" } }
排查与解决步骤
- 添加JSON解析中间件:确保Express应用中配置了
express.json(),否则服务器无法解析JSON请求体,req.body会是空对象,导致Mongoose判定所有字段缺失:const express = require('express'); const app = express(); // 必须添加此中间件 app.use(express.json()); - 修正Schema验证器拼写错误:
email字段的验证属性名写错了,应改为validate而非validator,错误的属性名会导致验证逻辑异常:email: { type: String, required: [true, '请输入有效的邮箱'], unique : true, lowercase: true, // 修正为 validate validate: [validator.isEmail, '请提供有效的邮箱'] }, - 验证请求发送规范:在Postman中确认请求方法为POST、请求头
Content-Type设为application/json、请求体JSON格式无语法错误。 - 调试请求体内容:在控制器中打印
req.body,确认服务器是否正确接收到参数:exports.signup = async (req, res, next) => { try { console.log('Received request body:', req.body); const newUser = await User.create(req.body) // 其他代码 } catch (err) { // 错误处理 } }
内容的提问来源于stack exchange,提问作者Meherab Hassan
相关产品推荐
相关产品推荐

