簡體   English   中英

在 NestJS 中使用 Mongoose 鑒別器時出現 OverwriteModelError

[英]OverwriteModelError while using Mongoose discriminators in NestJS

我按照NestJS 文檔介紹了如何實現 Mongoose 鑒別器,但令我驚訝的是,我經常得到OverwriteModelError 我花了幾個小時找出不同示例項目的問題,但這些努力都沒有成果!

我的項目樹就像添加一個具有 3 個模式的事件模塊一樣簡單:

- 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, SchemaFactory, 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, SchemaFactory, 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 替換 ZCCADCDEDB567ABAE643E15DCF0974E503Z.forFeature 解決了這個問題,希望這會有所幫助:

MongooseModule.forFeatureAsync([
  {
    name: Event.name,
    useFactory: () => {
      return EventSchema;
    },
    discriminators: [
      { name: ClickedLinkEvent.name, schema: ClickedLinkEventSchema },
      { name: SignUpEvent.name, schema: SignUpEventSchema },
    ],
  },
]),

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM