我有一个用例,在保存文档之前,我需要根据条件检查该文档是否是要保存的有效文档。
为了处理它,我尝试使用预保存猫鼬钩子。但我做错了一些事情,因此它不起作用。
我是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。
你把事情搞得太复杂了。最好使用 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用于用户模型示例。