我试图在我的nest js应用程序的自定义验证器类中使用我的一个MongoDB模型。我的模型是在一个名为“model”的文件夹中定义的。我使用mongoose的InjectModel在我的类中使用模型。这种方法在我的服务文件中起作用。但它在我的自定义验证文件中不起作用。我的schema定义是这样的:
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { HydratedDocument } from 'mongoose';
export type TemplateDocument = HydratedDocument<Template>;
@Schema()
export class Template {
@Prop({ required: true })
name: string;
@Prop({ required: true })
content: string;
@Prop({ required: true })
path: string;
@Prop({ required: false })
isSelected: boolean;
}
export const TemplateSchema = SchemaFactory.createForClass(Template);
在我的模块文件中,我导入模板模式如下:
import { Module } from '@nestjs/common';
import { TemplateController } from './template.controller';
import { TemplateService } from './template.service';
import { MongooseModule } from '@nestjs/mongoose';
import { Template, TemplateSchema } from 'src/models/template';
@Module({
imports: [
MongooseModule.forFeature([
{ name: Template.name, schema: TemplateSchema },
]),
],
controllers: [TemplateController],
providers: [TemplateService],
})
export class TemplateModule {}
我的自定义验证类在同一个文件夹 “Template” 中,但在一个子目录中。这是我的自定义类
import {
registerDecorator,
ValidationOptions,
ValidatorConstraint,
ValidatorConstraintInterface,
} from 'class-validator';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { Template } from '../../../../models/template';
import { Injectable } from '@nestjs/common';
@ValidatorConstraint({ async: true })
@Injectable()
export class IsTemplateNotExist implements ValidatorConstraintInterface {
constructor(
@InjectModel(Template.name) private templateModel: Model<Template>,
) {}
async validate(name: string): Promise<boolean> {
try {
console.log('this.templateModel = ', this.templateModel);
const template = await this.templateModel.findOne({ name }).exec();
console.log('template = ', template);
return template === null; // Use null instead of undefined
} catch (error) {
console.error('Error while querying template:', error);
return false; // Handle the error case appropriately
}
// return this.templateModel.findOne({ name }).then((template) => {
// console.log('tempate = ', template);
// return template === undefined;
// });
}
}
export function TemplateNotExist(validationOptions?: ValidationOptions) {
return function (object: object, propertyName: string) {
registerDecorator({
target: object.constructor,
propertyName: propertyName,
options: validationOptions,
constraints: [],
validator: IsTemplateNotExist,
});
};
}
- 但是在validate方法上this.templateModel是未定义的 * 我不知道这个问题的原因。提前感谢你的帮助。我是nest js和mongodb的新手。
1条答案
按热度按时间mpbci0fu1#
我从堆栈溢出显示的建议中得到了我的问题的解决方案,然后发布我的问题。给我答案的问题实际上不是我问的那个问题,而是看到我得到了答案。所以我想我应该把我的问题沿着在答案上,这样它就能帮助别人。
实际上,在我的模块文件中,我忘记指定
IsTemplateNotExist
类作为提供程序。我更新的模块文件看起来像这样: