mongoose 获取“查询模板时出错:TypeError:无法读取未定义的属性(阅读'findOne')”

h5qlskok  于 2023-10-19  发布在  Go
关注(0)|答案(1)|浏览(107)

我试图在我的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的新手。
mpbci0fu

mpbci0fu1#

我从堆栈溢出显示的建议中得到了我的问题的解决方案,然后发布我的问题。给我答案的问题实际上不是我问的那个问题,而是看到我得到了答案。所以我想我应该把我的问题沿着在答案上,这样它就能帮助别人。
实际上,在我的模块文件中,我忘记指定IsTemplateNotExist类作为提供程序。我更新的模块文件看起来像这样:

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';
import { IsTemplateNotExist } from './validations/templateNotExist.rule';

@Module({
  imports: [
    MongooseModule.forFeature([
      { name: Template.name, schema: TemplateSchema },
    ]),
  ],
  controllers: [TemplateController],
  providers: [TemplateService, IsTemplateNotExist],
})
export class TemplateModule {}

相关问题