#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