能否轻松将nestjs-typegoose替换为nestjs/mongoose?求助适配方案
替换nestjs-typegoose为@nestjs/mongoose的适配方案
1. 安装依赖
先卸载旧库,安装官方mongoose模块:
npm uninstall nestjs-typegoose @typegoose/typegoose npm install @nestjs/mongoose mongoose
2. 修改app.module.ts
将TypegooseModule替换为MongooseModule,配置逻辑基本兼容:
// app.module.ts import { MongooseModule } from '@nestjs/mongoose'; // 保留ConfigModule和ConfigService的原有导入 ... MongooseModule.forRootAsync({ imports: [ConfigModule], inject: [ConfigService], useFactory: getMongoConfig, // 原getMongoConfig函数无需修改(只要返回mongoose标准连接配置) }),
3. 修改实体模型(以user.model.ts为例)
替换typegoose装饰器为mongoose官方装饰器,调整模型结构:
// user.model.ts import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; import { Document } from 'mongoose'; // 定义结合实体与mongoose文档的类型 export type UserDocument = UserModel & Document; @Schema({ timestamps: true }) // 用Schema配置替代原TimeStamps类继承 export class UserModel { @Prop({ unique: true }) email: string; @Prop() passwordHash: string; } // 生成mongoose Schema实例 export const UserSchema = SchemaFactory.createForClass(UserModel);
4. 修改服务中的模型注入(以auth.service.ts为例)
替换导入的注入器和类型定义:
// auth.service.ts import { InjectModel } from '@nestjs/mongoose'; import { Model } from 'mongoose'; import { UserModel, UserDocument } from './user.model'; ... constructor( @InjectModel(UserModel) private readonly userModel: Model<UserDocument>, ) {}
5. 其他服务文件的返回类型调整
将DocumentType<ReviewModel>替换为对应的文档类型(定义方式同UserDocument):
// 其他服务示例 import { Model } from 'mongoose'; import { ReviewModel, ReviewDocument } from './review.model'; ... async create(dto: CreateReviewDto): Promise<ReviewDocument> { // 原有数据库操作逻辑(如create、findOne等)无需修改 return this.reviewModel.create(dto); }
关键适配说明
- 原typegoose的
@prop()对应mongoose的@Prop(),大部分配置参数(如unique)完全兼容 - 时间戳通过
@Schema({ timestamps: true })实现,无需继承TimeStamps类 - Mongoose的
Model<T>类型替代了ModelType<T>,T & Document替代了DocumentType<T> - 原有数据库操作API(如
find、updateOne等)无需修改,与typegoose封装的逻辑一致
内容的提问来源于stack exchange,提问作者r00k13
相关产品推荐
相关产品推荐

