如何在Mongoose中复用已有Schema?Node.js多用户开发问题
解决Mongoose Schema复用问题:继承通用用户属性
我来帮你搞定这个Schema复用的问题!首先得揪出问题的根源:你在user.js里只导出了User模型,而不是UserSchema本身。所以当你在rider.js里require('./user')时,拿到的是已经编译好的Model对象,不是Schema结构,这自然没法直接用来扩展新的Schema。另外,你原来的写法是把user作为嵌套字段,这不是你想要的“复用通用属性”——咱们要的是让Rider直接拥有User的所有字段,再加上自己的独有字段,对吧?
下面是具体的修复步骤:
第一步:修改user.js,导出通用Schema
调整原文件,同时导出Schema和Model,这样其他模型才能复用通用字段结构:
// Requiring Mongoose const mongoose = require('mongoose'); const Schema = mongoose.Schema; // Create User Schema const UserSchema = new Schema({ email: { type: String, required: [true, 'Email Field is required'], unique:true, match: /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/ }, name: { type: String, required: [true, 'Name field is required'] }, password: { type: String, required: [true, 'Please enter your password'] }, phoneNo: { type: String, required: [true, 'Phone No is required'] } }); // Create and export User Model const User = mongoose.model('user', UserSchema); // 同时导出Schema,供其他模型复用 module.exports = { User, UserSchema };
第二步:修改rider.js,继承通用Schema
现在可以导入UserSchema,用两种方式扩展出Rider的Schema:
方式一:使用Schema.add()方法扩展
这种方式会给通用Schema添加新字段,推荐先克隆原Schema,避免修改原结构:
const mongoose = require('mongoose'); // 导入UserSchema const { UserSchema } = require('./user'); // 克隆通用Schema,保证原Schema不受影响 const RiderSchema = new mongoose.Schema(UserSchema.obj); // 添加Rider独有的字段 RiderSchema.add({ familyNo: { type: String, required: [true, 'Family No is required'] } }); // 创建并导出Rider模型 const Rider = mongoose.model('rider', RiderSchema); module.exports = Rider;
方式二:使用ES6扩展运算符合并字段
如果你喜欢更直观的写法,直接用扩展运算符把通用字段和新字段合并:
const mongoose = require('mongoose'); const { UserSchema } = require('./user'); const RiderSchema = new mongoose.Schema({ // 扩展通用Schema的所有字段 ...UserSchema.obj, // 添加Rider独有字段 familyNo: { type: String, required: [true, 'Family No is required'] } }); const Rider = mongoose.model('rider', RiderSchema); module.exports = Rider;
为什么原来的方法失败?
- 你导入的是
User模型,不是UserSchema:模型是编译好的数据库映射对象,不能作为Schema字段使用。 - 嵌套写法不符合需求:原来的代码会让Rider文档里出现一个
user子对象,而不是直接拥有email、name等通用字段。
这样修改后,Rider模型就会同时拥有User的所有通用属性和自己的familyNo字段,完美实现代码复用啦!
内容的提问来源于stack exchange,提问作者Sagar Timalsina
相关产品推荐
相关产品推荐

