NestJS/TypeORM:无法读取未定义的属性“createQueryBuilder”

Posted

技术标签:

【中文标题】NestJS/TypeORM:无法读取未定义的属性“createQueryBuilder”【英文标题】:NestJS/TypeORM: Cannot read property 'createQueryBuilder' of undefined 【发布时间】:2021-02-27 10:25:06 【问题描述】:

在邮递员处调用“localhost:3000/contacts”(带或不带参数)返回此错误,我不知道为什么。我的后端连接到 PostgreSQL 数据库。

TypeError:无法读取未定义的属性“createQueryBuilder” 在 ContactsRepository.Repository.createQueryBuilder (...\Documents\Visual Studio Code Projects\funds-backend-nestjs\node_modules\typeorm\repository\Repository.js:17:29) 在 ContactsRepository.getContacts (...\Documents\Visual Studio Code Projects\funds-backend-nestjs\dist\contacts\contacts.repository.js:17:34) 在 ContactsService.getContacts (...\Documents\Visual Studio Code Projects\funds-backend-nestjs\dist\contacts\contacts.service.js:24:39) 在 ContactsController.getContacts (...\Documents\Visual Studio Code Projects\funds-backend-nestjs\dist\contacts\contacts.controller.js:25:37) 在 ...\Documents\Visual Studio Code Projects\funds-backend-nestjs\node_modules@nestjs\core\router\router-execution-context.js:38:29 在 processTicksAndRejections (internal/process/task_queues.js:93:5) 在异步 ...\Documents\Visual Studio Code Projects\funds-backend-nestjs\node_modules@nestjs\core\router\router-execution-context.js:46:28 在异步 ...\Documents\Visual Studio Code Projects\funds-backend-nestjs\node_modules@nestjs\core\router\router-proxy.js:9:17

我的代码如下所示:

@EntityRepository(Contact)
export class ContactsRepository extends Repository<Contact> 

  async getContacts(filterDto: GetContactsFilterDto): Promise<Contact[]> 
    const  name, search  = filterDto;
    // const query = this.createQueryBuilder('contacts');
    const query = await this.createQueryBuilder()
      .select('contacts')
      .from(Contact, 'contacts');

    if (name) 
      query.andWhere('contacts.name = :name',  name );
    

    if (search) 
      query.andWhere(
        '(contacts.email LIKE :search OR contacts.telephone LIKE :search)',
         search: `%$search%` ,
      );
    

    const contacts = await query.getMany();
    return contacts;
  
import  BaseEntity, Column, Entity, PrimaryGeneratedColumn  from 'typeorm';

@Entity( name: 'contacts' )
export class Contact extends BaseEntity 
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column()
  email: string;

  @Column()
  html_de: string;

  @Column()
  html_en: string;

  @Column()
  name: string;

  @Column()
  telephone: string;

export class ContactsController 
  constructor(private contactsService: ContactsService) 

  @Get()
  getContacts(
    @Query(ValidationPipe) filterDto: GetContactsFilterDto,
  ): Promise<ContactDto[]> 
    return this.contactsService.getContacts(filterDto);
  
@Injectable()
export class ContactsService 
  constructor(
    @InjectRepository(ContactsRepository)
    private contactsRepository: ContactsRepository,
  ) 

  async getContacts(filterDto: GetContactsFilterDto): Promise<Contact[]> 
    return this.contactsRepository.getContacts(filterDto);
  
import  Module  from '@nestjs/common';
import  TypeOrmModule  from '@nestjs/typeorm';

import  ContactsController  from './contacts.controller';
import  ContactsRepository  from './contacts.repository';
import  ContactsService  from './contacts.service';

@Module(
  controllers: [ContactsController],
  imports: [TypeOrmModule.forFeature([ContactsRepository])],
  providers: [ContactsRepository, ContactsService],
  exports: [ContactsRepository, ContactsService],
)
export class ContactsModule 

有人知道我该如何解决这个问题吗?问候

【问题讨论】:

在旧版本中,我没有使用别名“联系人”。那时我将我的实体命名为“联系人”以适合表名“联系人”。想让它更加一致,因为实体应该是单数的。有效。它与它有关系吗?因为现在我用 getManager 尝试了它,它又可以工作了。 const query = await getManager().createQueryBuilder(Contact, 'contacts'); github.com/typeorm/typeorm/blob/master/docs/… 你也可以显示你的ContactsModule吗? 我在服务中使用 TypeORM 的连接使其恢复工作:this.contactsRepository = this.connection.getCustomRepository(ContactsRepository); 我仍然想知道为什么我不能再使用依赖注入了。一定是因为Entity中使用的别名:@Entity( name: 'contacts' ) *** cmets 不进行多行格式化。您可以将其添加到您的问题正文而不是评论中吗? 我编辑了我的帖子并添加了模块。 【参考方案1】:

ContactsRepository 只能在TypeOrmModule.forFeature() 中使用,而不应添加到providersexports 数组中。在此处添加时,ContactsRepository 的注入令牌不再指向正确的实例,Nest 创建了该类,但没有正确扩展 Repository,因为该代码全部由 TypeORM 管理

【讨论】:

以上是关于NestJS/TypeORM:无法读取未定义的属性“createQueryBuilder”的主要内容,如果未能解决你的问题,请参考以下文章

Nestjs 与自定义存储库中的 Typeorm 事务

NestJS typeorm - 无法创建实体

NestJS TypeORM MongoDB 无法使用 find 或 FindOne 搜索存储库

NestJS / TypeOrm / Neo4j :Nest 无法解析 NEO4J_DRIVER 的依赖关系

Nx Monorepo NestJS TypeORM SQLite:无法连接到数据库

NestJS + Typeorm + Graphql:嵌套关系中 DTO 的正确设计模式