NodeJS + Mongoose:MissingSchemaError:模式尚未注册模型“类别”

Posted

技术标签:

【中文标题】NodeJS + Mongoose:MissingSchemaError:模式尚未注册模型“类别”【英文标题】:NodeJS+Mongoose: MissingSchemaError: Schema hasn't been registered for model "Category" 【发布时间】:2019-02-13 18:16:33 【问题描述】:

我正在尝试构建一个简单的博客,其中包含帖子和类别。文章当前可以添加到父类别中(将来可能会添加到多个类别中)。一个类别有很多文章。这是我想出的:

Category.js

const CategorySchema = new Schema(
    name: 
        type: String,
        required: true,
        trim: true
    ,
    user:  // I wanted to know what user created the category
        type: mongoose.Schema.Types.ObjectId, 
        ref: 'User'
    
,

    timestamps: true
);

const Category = mongoose.model('categories', CategorySchema);
module.exports = Category;

Article.js

const ArticleSchema = new Schema(
    name: 
        type: String,
        required: true,
        trim: true
    ,
    article_body: 
        type: String,
        trim: true
    ,
    userId:  
        type: mongoose.Schema.Types.ObjectId, 
        ref: 'User'
    ,
    categoryId:  
        type: mongoose.Schema.Types.ObjectId, 
        ref: 'Category'
    
,

    timestamps: true
);

const Article = mongoose.model('articles', ArticleSchema);

module.exports = Article;

当我尝试加载带有类别名称/详细信息的文章时:

Article.find().populate('categoryId').sort('name').exec(function(err, articles) 
            if(err) throw err;
            res.send(JSON.stringify(articles));
        );

我收到此错误:

MissingSchemaError: Schema hasn't been registered for model "Category".
Use mongoose.model(name, schema)

我是 NoSQL 的新手,所以我什至不确定这个模型结构是否适合我的情况(如果使用子/嵌入文档不是更好的话)。数据(文章)将被访问者阅读,访问者可以按类别过滤文章。

【问题讨论】:

您能否尝试在您的Category.js 文件末尾添加module.exports = Category; 你为什么这样做:const Article = mongoose.model('articles', EventSchema);而不是const Article = mongoose.model('articles', ArticleSchema);?你可以试试ref: 'categories' @BrijeshShah 在那里,复制代码时出错。 @LucasCosta 复制代码时出错,已更正。当我尝试添加 ref: 'categories 时,我收到此错误(来自 JSX 代码):Objects are not valid as a React child (found: object with keys _id, name, createdAt, updatedAt, __v). If you meant to render a collection of children, use an array instead. I was able to solve this problem by following this answer: https://***.com/questions/18001478/referencing-another-schema-in-mongoose 【参考方案1】:
const Category = mongoose.model('categories', CategorySchema);

上面一行说猫鼬你要声明的模型名称为categories

categoryId:  
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'Category' // this name does not match to 'categories'

这里你说categoryId 引用Category 模型!

所以问题在于您的模型名称声明。您应该在两行中使用相同的名称。

【讨论】:

嗨@hvish,谢谢你的回答。如果我将const Category = mongoose.model('categories', CategorySchema); 行更改为const Category = mongoose.model('Category', CategorySchema); 并加载数据(Article().populate('Category').sort('name').exec(function(err, events) ...),则不会发生任何事情。我正在尝试将类别名称打印为article.categoryId ? article.categoryId.name : 'no category'

以上是关于NodeJS + Mongoose:MissingSchemaError:模式尚未注册模型“类别”的主要内容,如果未能解决你的问题,请参考以下文章

egg-mongoose --- nodejs

nodejs mongoose安装问题

Mongoose + NodeJS - 循环浏览文档? [复制]

nodejs中使用mongoose保存数据

nodejs中使用mongoose保存数据

Mongoose + NodeJS Phorum 模式