微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 NestJS 中使用 Mongoose 鉴别器时出现 OverwriteModelError

如何解决在 NestJS 中使用 Mongoose 鉴别器时出现 OverwriteModelError

我关注了 NestJS documentation 如何实现 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,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 举报,一经查实,本站将立刻删除。