NestJs не может разрешать зависимости HeicService

Я получаю следующую ошибку при попытке раскрутить Nestjs

    [Nest] 47548  - 04/23/2022, 10:41:12 AM   ERROR [ExceptionHandler] Nest can't resolve dependencies of the HeicService (?, +). Please make sure that the argument dependency at index [0] is available in the HeicModule context.

Potential solutions:
- If dependency is a provider, is it part of the current HeicModule?
- If dependency is exported from a separate @Module, is that module imported within HeicModule?
  @Module({
    imports: [ /* the Module containing dependency */ ]
  })

Но насколько я понимаю, я делаю все правильно в отношении импорта/экспорта модулей, без циклической зависимости и так далее. Вот мои модули:

Приложение

import { Module } from '@nestjs/common';
import { EurekaModule } from './eureka/eureka.module';
import { HeicModule } from './heic/heic.module';

    @Module({
      imports: [HeicModule, EurekaModule],
    })
    export class AppModule {}

Конфигурация

import { Module } from '@nestjs/common';
import { ConfigService } from './config.service';

    @Module({
      providers: [ConfigService],
      exports: [ConfigService],
    })
    export class ConfigModule {}

КонфигСервис

import { Injectable } from '@nestjs/common';
import { Config } from './config.interface';

@Injectable()
export class ConfigService {
  private readonly map: Config;

Редис

import { CacheModule, Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { ConfigModule } from '../config/config.module';
import { ConfigService } from '../config/config.service';
import { RedisCacheService } from './redis-cache.service';
import * as redisStore from 'cache-manager-redis-store';
import { RedisPublishService } from './redis-publish.service';
    
@Module({
          imports: [
            CacheModule.register({
              imports: [ConfigModule],
              inject: [ConfigService],
              useFactory: async (configService: ConfigService) => ({
                store: redisStore,
                host: configService.get('host'),
                port: configService.get('port'),
                keyPrefix: configService.get('keyPrefix'),
                userName: configService.get('username'),
                password: configService.get('password'),
                ttl: configService.get('cacheTTL'),
              }),
            }),
            ClientsModule.register([
              {
                name: 'PUBLISH_SERVICE',
                transport: Transport.REDIS,
                options: {
                  url: 'redis://localhost:6379',
                },
              },
            ]),
          ],
          providers: [RedisCacheService, RedisPublishService],
          exports: [RedisCacheService, RedisPublishService],
        })
        export class RedisModule {}

Служба публикации/подписки Redis

import { Inject, Injectable } from '@nestjs/common';
import { ClientProxy } from '@nestjs/microservices';
import { ImageMessage } from './ImageMessage'; 
      
    @Injectable()
        export class RedisPublishService {
          private readonly CHANNEL: string = 'heic-image-result';
          constructor(@Inject('PUBLISH_SERVICE') private client: ClientProxy) {}
        
          async publishMessage(imageMessage: ImageMessage) {
            this.client.emit({ cmd: this.CHANNEL }, imageMessage);
          }
        }

Служба кэширования Redis

import { CACHE_MANAGER, Inject, Injectable } from '@nestjs/common';
import { Cache } from 'cache-manager';
import { ImageMessage } from './ImageMessage';

    @Injectable()
    export class RedisCacheService {
      constructor(@Inject(CACHE_MANAGER) private readonly cache: Cache) {}
    
      async get(key): Promise<ImageMessage> {
        return this.cache.get(key);
      }
    
      async set(key, value) {
        await this.cache.set(key, value, 120);
      }
    }

Хейк

import { Module } from '@nestjs/common';
import { RedisModule } from '../redis/redis.module';
import { HeicService } from './heic.service';
import { MessageListenerController } from './message-listener.controller';

    @Module({
      imports: [RedisModule],
      controllers: [MessageListenerController],
      providers: [HeicService],
      exports: [HeicService],
    })
    export class HeicModule {}

Услуга

import { Inject, Injectable } from '@nestjs/common';
import { ImageMessage } from '../redis/ImageMessage';
import { RedisCacheService } from '../redis/redis-cache.service';
import { RedisPublishService } from '../redis/redis-publish.service';
import { OutputFormatEnum } from './output-format.enum';
// eslint-disable-next-line @typescript-eslint/no-var-requires
const convert = require('heic-convert');

    @Injectable()
    export class HeicService {
      constructor(
        @Inject() private readonly redisPublishService: RedisPublishService,
        @Inject() private readonly redisCache: RedisCacheService,
      ) {}

Кто-нибудь знает, что я делаю неправильно?

как документы предлагают, у вас может быть круговой импорт файлов. Вы можете использовать npmjs.com/package/мэдж, чтобы помочь вам

Micael Levi 23.04.2022 14:43

Спасибо, я установил madge и попробовал его на app.module.ts, а также на каждом модуле здесь с madge --circular path/src/{file}. Но для каждого модуля он говорит, что циклической зависимости нет. Я включил здесь импорт для файлов, но не могу найти ничего, что намекало бы на это.

NightKnight 23.04.2022 15:42

Это определенно что-то с модулем Redis. Если я отрежу его, он снова работает. Я разделил его на два модуля redis-publish и redis-cache, и все же, только если я вырезаю обе зависимости из heic.module, он снова работает.

NightKnight 23.04.2022 17:53
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
3
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы используете @Inject() в своих конструкторах без токена инъекции. Вы должен передаете токен инъекции, который хотите внедрить сюда. Тогда HeicServiceconstructor будет выглядеть примерно так:

@Injectable()
export class HeicService {
  constructor(
    @Inject(RedisPublishService) private readonly redisPublishService: RedisPublishService,
    @Inject(RedisCacheService) private readonly redisCache: RedisCacheService,
  ) {}
}

Другой вариант, поскольку вы уже используете классы для RedisCacheService и RedisPublishService, состоит в том, чтобы просто удалить декораторы @Inject() все вместе для HeicService.

Другие вопросы по теме

Передача vscode во внешние функции
Firebase: Почему мой код использует только первый документ в моей коллекции?
Реагировать на ошибку машинописного текста - элемент неявно имеет любой тип, потому что выражение строки типа не может использоваться для индексирования типа {}
Как получить доступ к вложенным необязательным индексам из интерфейса
Почему машинописный текст не может контекстуально вывести эти типы промежуточного программного обеспечения
Передать конструктор класса как функцию в другом классе
React & clsx: добавьте имя класса, если текущий элемент в сопоставленном массиве является первым из нескольких элементов
Свойство «MathFun» отсутствует в типе «(x?: число, y?: число) => число», но требуется в типе «Func».
Получение строки типа не может быть назначено строке типа для компонента TS в сборнике рассказов
Как ввести useState для файлов?