mongoose - 在 NestJS 中使用 Mongoose 鉴别器时出现 OverwriteModelError
问题描述
我关注了关于如何实现 Mongoose 鉴别器的NestJS 文档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 替换 Mongoose.forFeature 解决了这个问题,希望这会有所帮助:
MongooseModule.forFeatureAsync([
{
name: Event.name,
useFactory: () => {
return EventSchema;
},
discriminators: [
{ name: ClickedLinkEvent.name, schema: ClickedLinkEventSchema },
{ name: SignUpEvent.name, schema: SignUpEventSchema },
],
},
]),
推荐阅读
- javascript - 如何让 Javascript 'addEventListener' 处理我的简单动画?
- regex - 解析时不匹配一组模式应该如何工作?
- php - 如何使用 PHP 中的 URL 和 MySQL 数据库条目自动创建内容显示的 HTML 文件
- python - 如何将一个张量的值插入另一个张量?
- javascript - 在 react 和 javascript 中删除并获取 sessionid
- javascript - 我正在尝试创建非常简单的 wordpress 插件,但我的 javascript 无法正常工作
- c# - 由于其保护级别 C# 而无法访问
- python - GCP Sheets/Docs API 不在 iframe 中显示文件
- docusignapi - 是否有 API 来跟踪 DocuSign 发送的信封状态?
- pandas - 从每日到每分钟更快地重新采样每日协方差矩阵 (MultiIndex)