无法在nestJs中使用预保存猫鼬钩子

问题描述 投票:0回答:1

我有一个用例,在保存文档之前,我需要根据条件检查该文档是否是要保存的有效文档。

为了处理它,我尝试使用预保存猫鼬钩子。但我做错了一些事情,因此它不起作用。

我是NestJs的初学者,请帮助我识别并解决问题。我将非常感谢任何帮助。

这是 schema.ts 文件 -

import mongoose, { Schema } from 'mongoose';
import * as beautifyUnique from 'mongoose-unique-validator';
import { GenieGames, Status } from 'src/common/globalEnums.enums';

const GenieJourneySchema = new Schema(
  {
    name: {
      type: String,
    },
    userId: {
      type: String,
    },
    companyId: {
      type: Schema.Types.ObjectId,
      ref: 'Companies',
      required: true,
    },
    __deletedAt__: {
      type: Date,
      default: undefined,
    },
    topic: {
      type: String,
    }
    
)
  .index({ companyId: 1, name: 1, __deletedAt__: 1 }, { unique: true })
  .plugin(beautifyUnique, {
    message: 'Journey name exists ({VALUE})',
  });


export const GenieJourneySchemaProvider = {
  provide: 'GenieJourney',
  useFactory: (): Promise<void> => {

    const model = mongoose.model('GenieJourney', GenieJourneySchema);

    GenieJourneySchema.pre('save', async function(next) {
      const companyId = '66cc605febff3c565065d17b';

      if (this.companyId.toString() === companyId) {
        const existingTopic = await model.findOne({ companyId: companyId, topic: this.topic, __deletedAt__: null });

        if (existingTopic) {
          return next(new Error('Topic must be unique within the company.'));
        }
      }

      next();
    });
    return;
  }
}

以下是我在其中配置架构的 module.ts 文件-

@Module({
  imports: [
    HttpModule,
    MongooseModule.forFeatureAsync([
      { name: 'Geniejourney', 
        useFactory: GenieJourneySchemaProvider.useFactory
      }
    ])
  ],
  providers: [GenieJourneyService, GenieJourneySchemaProvider],
  controllers: [GenieJourneyController],
  exports: [MongooseModule],
})
export class GenieJourneyModule {
}

我尝试过各种方法,但没有任何效果。我期望我能够在特定公司内创建具有独特主题的 genieJourney。

typescript mongoose nestjs
1个回答
0
投票

你把事情搞得太复杂了。最好使用 NestJS mongoose 包装器 (@nestjs/mongoose)。

请查看我的 NestJS 入门项目中的用户模型。

https://github.com/tivanov/nestjs-angular-starter/blob/master/backend/src/users/model/user.model.ts

我使用带有装饰器的类来定义模式,然后使用内置的 SchemaFactory 来生成模式提供程序。这将为您处理好一切。

然后,只需添加预保存侦听器,您就可以开始了。

要“注册”模型,只需提供模式提供程序。看看 https://github.com/tivanov/nestjs-angular-starter/blob/master/backend/src/users/users.module.ts用于用户模型示例。

© www.soinside.com 2019 - 2024. All rights reserved.