【问题标题】:NestJS/TypeORM: Cannot read property 'createQueryBuilder' of undefinedNestJS/TypeORM:无法读取未定义的属性“createQueryBuilder”
【发布时间】: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' })
  • StackOverflow cmets 不进行多行格式化。您可以将其添加到您的问题正文而不是评论中吗?
  • 我编辑了我的帖子并添加了模块。

标签: javascript node.js typescript nestjs typeorm


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2021-10-12
    • 2021-05-29
    • 1970-01-01
    • 2021-10-30
    • 2020-04-04
    相关资源
    最近更新 更多