NestJS / TypeORM: не удается прочитать свойство ‘createQueryBuilder’ неопределенного

#javascript #node.js #typescript #nestjs #typeorm

#javascript #node.js #typescript #nestjs #typeorm

Вопрос:

Вызов ‘localhost: 3000 / contacts’ (с параметрами или без параметров) в postman возвращает мне эту ошибку, и я не знаю почему. Мой серверный сервер подключен к базе данных PostgreSQL.

 TypeError: Cannot read property 'createQueryBuilder' of undefined
    at ContactsRepository.Repository.createQueryBuilder (...DocumentsVisual Studio Code Projectsfunds-backend-nestjsnode_modulestypeormrepositoryRepository.js:17:29)
    at ContactsRepository.getContacts (...DocumentsVisual Studio Code Projectsfunds-backend-nestjsdistcontactscontacts.repository.js:17:34)
    at ContactsService.getContacts (...DocumentsVisual Studio Code Projectsfunds-backend-nestjsdistcontactscontacts.service.js:24:39)
    at ContactsController.getContacts (...DocumentsVisual Studio Code Projectsfunds-backend-nestjsdistcontactscontacts.controller.js:25:37)
    at ...DocumentsVisual Studio Code Projectsfunds-backend-nestjsnode_modules@nestjscorerouterrouter-execution-context.js:38:29
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
    at async ...DocumentsVisual Studio Code Projectsfunds-backend-nestjsnode_modules@nestjscorerouterrouter-execution-context.js:46:28
    at async ...DocumentsVisual Studio Code Projectsfunds-backend-nestjsnode_modules@nestjscorerouterrouter-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 {}
  

Кто-нибудь знает, как я могу это исправить? С уважением

Комментарии:

1. В более старой версии я не использовал псевдоним ‘contacts’. Тогда я назвал свою сущность ‘контакты’, чтобы соответствовать имени таблицы ‘контакты’. Хотел сделать его более последовательным, потому что сущность должна быть единственной. Это сработало. Имеет ли это какое-то отношение к этому? Потому что прямо сейчас я попробовал это с помощью getManager, и он снова работает. const query = await getManager().createQueryBuilder(контакт, ‘контакты’); github.com/typeorm/typeorm/blob/master/docs /…

2. Можете ли вы также показать свой ContactsModule ?

3. Я вернул его к работе, используя соединение TypeORM в службе: this.contactsRepository = this.connection.getCustomRepository(ContactsRepository); тем не менее, мне интересно, почему я больше не могу использовать внедрение зависимостей. Это должно быть из-за псевдонима, используемого в сущности: @Entity({ name: 'contacts' })

4. Комментарии StackOverflow не выполняют многострочное форматирование. Можете ли вы добавить его в текст вашего вопроса вместо комментария?

5. Я отредактировал свой пост и добавил модуль.

Ответ №1:

ContactsRepository должно использоваться только в TypeOrmModule.forFeature() и не добавляться в массив providers or exports . Когда оно добавляется сюда, токен внедрения for ContactsRepository больше не указывает на соответствующий экземпляр, и Nest создает класс, но не имеет его надлежащего расширения Repository , поскольку весь этот код управляется TypeORM