使用Mongoose报错:Model不是合法的Schema字段类型
解决Mongoose报错:TypeError: Invalid schema configuration:
Model is not a valid type at path 报错信息
C:\Users\my_is\Programming\Project\node_modules\mongoose\lib\schema.js:1340 throw new TypeError(`Invalid schema configuration: \`${name}\` is not ` + ^ TypeError: Invalid schema configuration: `Model` is not a valid type at path `role`. See at Schema.interpretAsType at Schema.path at Object.<anonymous> (C:\Users\my\Programming\Project\Collections\Admin.js:6:30) at Module._compile (node:internal/modules/cjs/loader:1159:14) at Module._extensions..js (node:internal/modules/cjs/loader:1213:10) at Module.load (node:internal/modules/cjs/loader:1037:32) at Module._load (node:internal/modules/cjs/loader:878:12)
相关代码
Role.js
const mongoose = require("mongoose"); const roleSchema = mongoose.Schema({ role : Number, description : String }); module.exports = mongoose.model("Role", roleSchema);
Admin.js
const mongoose = require("mongoose"); const Role = require("./Role"); //const Role = require("./Role").schema; const adminSchema = mongoose.Schema({ firstName : String, lasteName : String, email : String, dateCreate : { type: Date, default : Date.now } , role : Role }) module.exports = mongoose.model("Admin", adminSchema);
logic.js
const Role = require('./Collections/Role'); const role = Role.create({ role: 2, description: 'Editor' }) console.log(role);
问题原因
报错的核心是:你在Admin Schema中把Mongoose返回的Model对象(Role)直接当成了字段类型。mongoose.model()生成的是操作数据库的模型实例,不是Schema类型,不能直接用于定义另一张表的字段类型。你注释掉的require("./Role").schema才是正确的方向。
解决方案
根据业务需求分两种场景处理:
场景1:将Role结构嵌入Admin作为子文档
如果希望Admin表直接包含Role的完整数据(子文档形式),需要引入Role的Schema而非Model:
// 修改后的Admin.js const mongoose = require("mongoose"); // 引入Role的Schema const roleSchema = require("./Role").schema; const adminSchema = mongoose.Schema({ firstName : String, lastName : String, // 修正拼写错误:lasteName → lastName email : String, dateCreate : { type: Date, default : Date.now } , // 用roleSchema作为字段类型 role : roleSchema }) module.exports = mongoose.model("Admin", adminSchema);
场景2:建立Admin与Role的关联引用
如果希望Admin的role字段关联到Role表中的独立文档,需要使用ObjectId类型并指定关联模型:
// 修改后的Admin.js const mongoose = require("mongoose"); const Role = require("./Role"); const adminSchema = mongoose.Schema({ firstName : String, lastName : String, // 修正拼写错误 email : String, dateCreate : { type: Date, default : Date.now } , // 定义ObjectId类型,关联到Role模型 role : { type: mongoose.Schema.Types.ObjectId, ref: "Role" } }) module.exports = mongoose.model("Admin", adminSchema);
这种场景下创建Admin时,需要传入已存在的Role文档ID:
// 修正后的logic.js const Role = require('./Collections/Role'); const Admin = require('./Collections/Admin'); async function createAdminWithRole() { // 先创建Role const newRole = await Role.create({ role: 2, description: 'Editor' }); // 创建关联该Role的Admin const newAdmin = await Admin.create({ firstName: "John", lastName: "Doe", email: "john@example.com", role: newRole._id }); console.log(newAdmin); } createAdminWithRole();
额外注意点
Role.create()是异步操作,必须用await或.then()处理,否则console.log(role)会打印Promise对象而非实际创建的文档。- 代码中
lasteName拼写错误,建议修正为lastName避免后续字段操作问题。
内容的提问来源于stack exchange,提问作者user1960836
相关产品推荐
相关产品推荐

