如何解决在 NestJS 中使用 Mongoose 鉴别器时出现 OverwriteModelError
我关注了 NestJS documentation 如何实现 Mongoose 鉴别器,但令我惊讶的是,我不断得到 OverwriteModelError
。我花了几个小时找出不同示例项目的问题,但这些努力都没有结果!
- src
|- event
| |- click-link-event.schema.ts
| |- event.module.ts
| |- event.schema.ts
| |- sign-up-event.schema.ts
|- app.module.ts
|- main.ts
// main.ts
import { nestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await nestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
// app.module.ts
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { EventModule } from './event/event.module';
@Module({
imports: [
MongooseModule.forRoot('mongodb://localhost:27017/test_db'),EventModule,],})
export class AppModule {}
// event.module.ts
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { Event,EventSchema } from './event.schema';
import {
ClickedLinkEvent,ClickedLinkEventSchema,} from './click-link-event.schema';
import { SignUpEvent,SignUpEventSchema } from './sign-up-event.schema';
@Module({
imports: [
MongooseModule.forFeature([
{
name: Event.name,schema: EventSchema,discriminators: [
{ name: ClickedLinkEvent.name,schema: ClickedLinkEventSchema },{ name: SignUpEvent.name,schema: SignUpEventSchema },},]),})
export class EventModule {}
// event.schema.ts
import { Schema,SchemaFactory,Prop } from '@nestjs/mongoose';
import { ClickedLinkEvent } from './click-link-event.schema';
import { SignUpEvent } from './sign-up-event.schema';
@Schema({ discriminatorKey: 'kind' })
export class Event {
@Prop({
type: String,required: true,enum: [ClickedLinkEvent.name,SignUpEvent.name],})
kind: string;
@Prop({ type: Date,required: true })
time: Date;
}
export const EventSchema = SchemaFactory.createForClass(Event);
// click-link-event.schema.ts
import { Schema,Prop } from '@nestjs/mongoose';
@Schema()
export class ClickedLinkEvent {
kind: string;
time: Date;
@Prop({ type: String,required: true })
url: string;
}
export const ClickedLinkEventSchema = SchemaFactory.createForClass(
ClickedLinkEvent,);
// sign-up-event.schema.ts
import { Schema,Prop } from '@nestjs/mongoose';
@Schema()
export class SignUpEvent {
kind: string;
time: Date;
@Prop({ type: String,required: true })
user: string;
}
export const SignUpEventSchema = SchemaFactory.createForClass(SignUpEvent);
如您所见,我所做的只是复制文档中使用的代码。这是我在执行 npm run start:dev
时遇到的错误:
[nest] 4046 - 01/11/2021,1:37:16 AM [nestFactory] Starting nest application...
[nest] 4046 - 01/11/2021,1:37:16 AM [InstanceLoader] AppModule dependencies initialized
[nest] 4046 - 01/11/2021,1:37:16 AM [InstanceLoader] MongooseModule dependencies initialized +0ms
[nest] 4046 - 01/11/2021,1:37:16 AM [InstanceLoader] EventModule dependencies initialized +1ms
[nest] 4046 - 01/11/2021,1:37:16 AM [InstanceLoader] MongooseCoreModule dependencies initialized +19ms
[nest] 4046 - 01/11/2021,1:37:16 AM [ExceptionHandler] Cannot overwrite `ClickedLinkEvent` model once compiled. +19ms
OverwriteModelError: Cannot overwrite `ClickedLinkEvent` model once compiled.
at Function.Model.discriminator (/home/SAEed/sources/playground/discriminators/event-test/node_modules/mongoose/lib/model.js:1137:11 )
at /home/SAEed/sources/playground/discriminators/event-test/node_modules/@nestjs/mongoose/dist/mongoose.providers.js:15:56 at Array.forEach (<anonymous>)
at adddiscriminators (/home/SAEed/sources/playground/discriminators/event-test/node_modules/@nestjs/mongoose/dist/mongoose.providers .js:15:20)
at InstanceWrapper.useFactory [as Metatype] (/home/SAEed/sources/playground/discriminators/event-test/node_modules/@nestjs/mongoose/ dist/mongoose.providers.js:25:17)
at Injector.instantiateClass (/home/SAEed/sources/playground/discriminators/event-test/node_modules/@nestjs/core/injector/injector.j s:289:55)
at callback (/home/SAEed/sources/playground/discriminators/event-test/node_modules/@nestjs/core/injector/injector.js:42:41)
at processticksAndRejections (internal/process/task_queues.js:93:5)
at async Injector.resolveConstructorParams (/home/SAEed/sources/playground/discriminators/event-test/node_modules/@nestjs/core/injec tor/injector.js:114:24)
at async Injector.loadInstance (/home/SAEed/sources/playground/discriminators/event-test/node_modules/@nestjs/core/injector/injector .js:46:9)
at async Injector.loadProvider (/home/SAEed/sources/playground/discriminators/event-test/node_modules/@nestjs/core/injector/injector .js:68:9)
at async Promise.all (index 5) at async InstanceLoader.createInstancesOfProviders (/home/SAEed/sources/playground/discriminators/event-test/node_modules/@nestjs/co re/injector/instance-loader.js:43:9)
at async /home/SAEed/sources/playground/discriminators/event-test/node_modules/@nestjs/core/injector/instance-loader.js:28:13 at async Promise.all (index 5)
at async InstanceLoader.createInstances (/home/SAEed/sources/playground/discriminators/event-test/node_modules/@nestjs/core/injector /instance-loader.js:27:9)
是 nestJS 处理方式的错误还是我错过了一些如此愚蠢的东西?
解决方法
我通过用 Mongoose.forFeatureAsync 替换 Mongoose.forFeature 解决了这个问题,希望这会有所帮助:
MongooseModule.forFeatureAsync([
{
name: Event.name,useFactory: () => {
return EventSchema;
},discriminators: [
{ name: ClickedLinkEvent.name,schema: ClickedLinkEventSchema },{ name: SignUpEvent.name,schema: SignUpEventSchema },],},]),
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。