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’ }] });
当然可以!根据你的描述,你在 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);
解释
-
定义
Role
模型:- 在
role.js
文件中,我们首先定义了一个RoleSchema
。 - 使用
mongoose.model('Role', RoleSchema)
方法注册Role
模型,并将其导出。
- 在
-
在
users.js
中引用Role
模型:- 在
users.js
文件中,我们通过require('./role.js')
引入了Role
模型。 - 注意我们使用
{ Role } = require('./role.js')
的方式来解构导入的Role
模型。 - 在
UserSchema
中,我们定义了一个roleArr
字段,它是一个包含ObjectId
类型的数组,并且ref
属性指向Role
模型。
- 在
-
注册
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。
解决方案
- 确保
Role
模型被正确注册:你需要在role.js
文件中定义并注册Role
模型。 - 在
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”
的错误。