Nodejs mongoose嵌套问题求助

Nodejs mongoose嵌套问题求助

存在两个model文件,分别是 users.js 和role.js 现在在users model中引入role model ,出现Schema hasn’t been registered for model “Role” users model 如下形式: var mongoose = require(’…/api/connect.js’); var RoleSchema = require(’./Role.js’).RoleSchema; var Role = mongoose.model(‘roles’, RoleSchema);

exports.UserSchema = new mongoose.Schema({ username: String, password: String, … roleArr:[{ type: mongoose.Schema.Types.ObjectId, ref: ‘Role’ }] });


9 回复

当然可以!根据你的描述,你在 users.js 文件中引入了 role.js 模型,并且在 UserSchema 中引用了 Role。但你遇到了一个错误提示:Schema hasn’t been registered for model “Role”。这是因为你需要先注册 Role 模型,然后再使用它。

下面是一个具体的解决方案,包括示例代码和解释:

示例代码

role.js

const mongoose = require('../api/connect.js');

// 定义 Role 的 Schema
const RoleSchema = new mongoose.Schema({
    name: String,
    description: String
});

// 注册 Role 模型
module.exports.Role = mongoose.model('Role', RoleSchema);

users.js

const mongoose = require('../api/connect.js');
const { Role } = require('./role.js'); // 引入 Role 模型

// 定义 User 的 Schema
const UserSchema = new mongoose.Schema({
    username: String,
    password: String,
    roleArr: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Role' }]
});

// 导出 User 模型
module.exports.User = mongoose.model('User', UserSchema);

解释

  1. 定义 Role 模型

    • role.js 文件中,我们首先定义了一个 RoleSchema
    • 使用 mongoose.model('Role', RoleSchema) 方法注册 Role 模型,并将其导出。
  2. users.js 中引用 Role 模型

    • users.js 文件中,我们通过 require('./role.js') 引入了 Role 模型。
    • 注意我们使用 { Role } = require('./role.js') 的方式来解构导入的 Role 模型。
    • UserSchema 中,我们定义了一个 roleArr 字段,它是一个包含 ObjectId 类型的数组,并且 ref 属性指向 Role 模型。
  3. 注册 User 模型

    • 最后,在 users.js 文件中,我们使用 mongoose.model('User', UserSchema) 方法注册 User 模型,并将其导出。

通过这种方式,你可以确保 Role 模型已经注册,然后在 User 模型中正确引用它。这样应该可以解决你遇到的 Schema hasn’t been registered for model “Role” 错误。


你的RoleSchema (Role.js)文件呢? require(’./Role’); require(’./User’); exports.Topic=mongoose.model(‘role’); exports.User=mongoose.model(‘user’); 在Model文件夹中的index.js使用以上代码

还有不需要你引入Role模块,ref 的属性值是字符串类型,如果你有建立 role模型 mongoRose 会在你使用populate 方法 通过ref 属性 查找Role模块。

这是Role.js var mongoose = require(‘mongoose’); exports.RoleSchema = new mongoose.Schema({ roleName: String, … }); 没有index.js

我在user的model 中注释了 如下引用代码: var RoleSchema = require(’./Role.js’).RoleSchema; var Role = mongoose.model(‘roles’, RoleSchema);

但是 还是 出现如下出错!! Schema hasn’t been registered for model “Role”.

查询使用如下方法: Users.findOne({username:req.body.username}).populate(‘roleArr’).exec(function(err,doc){ … });

http://mongoosejs.com/docs/index.html 把 mongoosejs 的迅速上手文档仔细看看。 你不需要 new 一个新的Schema. 直接 var RoleSchema = mongoose.Schema({ \你的代码 });

找到问题原因了: 由于将Role model注册到roles 代码如下:var Role = mongoose.model(‘roles’, RoleSchema); 因此ref 的时候 应该写ref:‘roles’ 。

根据你的描述,在 users.js 文件中引入 role.js 模型时遇到了 Schema hasn’t been registered for model “Role” 的错误。这是因为你需要确保 Role 模型已经被正确注册到 Mongoose。

解决方案

  1. 确保 Role 模型被正确注册:你需要在 role.js 文件中定义并注册 Role 模型。
  2. users.js 中引用已经注册的 Role 模型:确保在 users.js 中正确引用已经注册的 Role 模型。

示例代码

role.js

const mongoose = require('../api/connect.js');

// 定义 Role Schema
const RoleSchema = new mongoose.Schema({
    name: String,
    permissions: [String]
});

// 注册 Role 模型
const Role = mongoose.model('Role', RoleSchema);

module.exports = {
    RoleSchema,
    Role
};

users.js

const mongoose = require('../api/connect.js');
const { Role } = require('./role.js');

exports.UserSchema = new mongoose.Schema({
    username: String,
    password: String,
    roleArr: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Role' }]
});

解释

  • role.js 文件中,我们定义了 RoleSchema 并使用 mongoose.model() 方法注册了 Role 模型。
  • users.js 文件中,我们从 role.js 导入了 Role 模型,并在 UserSchema 中正确地使用了 ref: 'Role'

通过这种方式,Mongoose 将能够正确识别并注册 Role 模型,从而避免 Schema hasn’t been registered for model “Role” 的错误。

回到顶部