Модуль NestJS не внедряет зависимость от своего преобразователя - PullRequest
0 голосов
/ 17 октября 2019

Я работал над API, основанным на NestJS, и вот часть кода, в которой у меня довольно странное поведение.

ПРОБЛЕМА: PagePartModule НЕ импортирует какой-либо модуль, который я добавляю в импорт (в данном случае ImageModule), и поэтому я получаю неопределенное значение при попытке вставить ImageService в распознаватель PagePartModule. Пожалуйста, смотрите код ниже:

// page-part.module.ts
@Module({
  imports: [ImageModule],
  providers: [PagePartImageResolver],
})
export class PagePartModule {}



// page-part-image.resolver.ts
@Resolver(of => PagePartImage)
export class PagePartImageResolver {

  constructor(
    private readonly imageService: ImageService
  ) {}

  @ResolveProperty('image', type => Image, { nullable: true })
  async image(@Root() pagePart: PagePart) {
    // NOTE: pagePart is filled with correct data
    // ERROR: "Cannot read property 'find' of undefined",
    // this.imageService is undefined
    return await this.imageService.find({ id: pagePart.imageId });
  }
}


// image.module.ts
@Module({
  imports: [DataloaderModule],
  providers: [ImageResolver, ImageService],
  exports: [ImageService],
})
export class ImageModule {}



// image.service.ts
@Injectable()
export class ImageService {}

Обратите внимание, что я:
1) Добавление ImageService в декоратор экспорта экспорта ImageModule
2) ImageService украшен @Injectable ()
3)Импорт ImageModule (который предоставляет ImageService) через импорт на PagePartModule
4) Инжекция ImageService с помощью конструктора в page-part-image.resolver.ts

Что я пробовал:
- Ошибка не выдаетсяNestJS на время сборки;Как только я запрашиваю поле «image» для распознавателей, появляется сообщение: Cannot read property 'find' of undefined -> imageService не определено: не внедрено.
- Если я внедряю модуль ImageModule в другой модуль, все работает как положено.
- Даже если ясоздайте сервис, который является частью PagePartModule, и поместите его в провайдеров PagePartModule, он все еще не внедрен в указанный преобразователь - что странно (но попытка импортировать созданный сервис в другой модуль снова работает как положено). - "emitDecoratorMetadata": true существует в моем tsconfig.json

Я считаю, что я делаю все, что нужно для инъекции, чтобы работать. (В API более десятка модулей, в которых я использую тот же подход, и он работает как положено)

Буду признателен за любые указания относительно того, что может вызвать проблему.

1 Ответ

0 голосов
/ 29 октября 2019
// incorrectly imported decorator
import { Resolver } from 'type-graphql';  

// correctly imported decorator in NestJS
import { Resolver } from '@nestjs/graphql';
...