Mongoose创建集合报错Invalid schema configuration:S不是有效类型
报错根因
你遇到的Invalid schema configuration: S is not a valid type at path 0错误是API调用错误导致的:
- 代码最后创建集合对应模型时,误用了
mongoose.Schema构造方法,这个方法是用来定义Schema结构的,不是用来生成数据集合模型的API - 你传入的第一个参数是字符串
'Student',Mongoose把这个字符串当成Schema配置对象解析时,会把字符串索引为0的字符S识别为路径0的类型配置,自然就判定S不是合法的Schema类型,抛出对应错误。
另外你的代码里还有一处隐性问题:phone字段定义为Number类型,却使用了仅对字符串生效的minlength/maxlength校验规则,就算修复了API调用错误,这两个校验也不会正常生效;且手机号存储为Number类型会出现前导0丢失、长数字精度溢出的问题,不推荐使用。
修复方法
- 将创建集合模型的API替换为正确的
mongoose.model()方法,该方法接收两个参数:模型名称、对应的Schema对象,Mongoose会自动将模型名转为复数小写形式作为MongoDB中的集合名(传入Student会对应students集合) - 修正
phone字段的类型与校验规则,推荐将手机号改为String类型,原有长度校验即可正常生效。
修正后完整代码
const mongoose = require('mongoose'); const validator = require('validator'); const schema = new mongoose.Schema({ uname:{ type:String, required:true, minlength:[3,"minimum length of student name must be greater than 3 characters"] }, phone:{ // 手机号改为String类型,避免精度丢失、前导0截断问题 type:String, required:true, minlength:10, maxlength:10 }, email:{ type:String, required:true, unique:true // 可直接使用引入的validator增加邮箱格式校验: // validate: [validator.isEmail, 'Please enter a valid email address'] }, address:{ type:String, required : true } }) // 调用正确的mongoose.model方法创建集合模型 const StudentData = mongoose.model('Student',schema); module.exports = StudentData;
关键注意点
- Mongoose中定义Schema结构用
new mongoose.Schema(配置对象),根据Schema生成可操作的集合模型必须用mongoose.model(模型名, schema实例) - 长度校验规则
minlength/maxlength仅对String类型字段生效,Number类型的范围校验需要用min/max配置
内容的提问来源于stack exchange,提问作者Sujeet kumar
相关产品推荐
相关产品推荐

