使用Mongoose连接MongoDB时遇MissingSchemaError:未注册User模型
问题:Mongoose报错
MissingSchemaError: Schema hasn't been registered for model "User" 运行Mongoose连接MongoDB并使用User模型时,出现如下错误:
MissingSchemaError: Schema hasn't been registered for model "User"
用户提供的代码:
const mongoose = require('mongoose') const Schem = mongoose.Schema mongoose.Promise = global.Promise const md5 = require('md5') const validator = require('validator') const mongodbErrorHandler = require('mongoose-mongodb-erros') const passportalocalMongoose = require ('passport-local-mongoose') const userSchema = new Schema ({ username: { type:string, unique: true }, password:{ type:string }, module.exports = mongoose.model('User', userSchema) })
错误原因分析
- 变量名拼写错误:将
mongoose.Schema赋值给了Schem(少了一个字母a),后续创建userSchema时调用的new Schema未定义,导致Schema无法正确实例化。 - 类型定义错误:字段类型使用了小写的
string,Mongoose要求使用大写的String(JavaScript内置构造函数)。 - 代码结构错误:
module.exports语句被错误包裹在userSchema的定义括号内部,导致模型还未完成创建就执行导出,同时破坏了Schema定义的语法结构。 - 语法冗余错误:
password字段定义末尾多了一个逗号,会引发JavaScript语法解析错误。
解决方法及修正后的代码
修正上述所有问题后,代码如下:
const mongoose = require('mongoose') // 修正变量名拼写 const Schema = mongoose.Schema mongoose.Promise = global.Promise const md5 = require('md5') const validator = require('validator') const mongodbErrorHandler = require('mongoose-mongodb-errors') const passportLocalMongoose = require('passport-local-mongoose') // 修正类型为大写String,移除多余逗号 const userSchema = new Schema({ username: { type: String, unique: true }, password: { type: String } }) // 挂载passport-local-mongoose(若需使用其认证功能则保留) userSchema.plugin(passportLocalMongoose) // 挂载mongodb错误处理插件 userSchema.plugin(mongodbErrorHandler) // 将导出语句移到Schema定义外部 module.exports = mongoose.model('User', userSchema)
额外说明:
- 若不需要
md5、validator等依赖,可根据实际需求移除。 - 使用
passport-local-mongoose时,插件会自动处理用户名密码的存储与验证逻辑,甚至可以不用手动定义username和password字段,具体可根据业务需求调整。
内容的提问来源于stack exchange,提问作者Yusuf Abdulrasheed
相关产品推荐
相关产品推荐

