Как импортировать | экспортировать services в NestJS правильно?

Ссылка скопирована
1 ответ

И так... у меня есть приложение на NestJS пишу недавно так что многого не знаю, вчера залупился с такой тупой ошибкой:

Error: Nest can't resolve dependencies of the TelegramService (?, PrismaService). Please make sure that the argument TelegramValidateService at index [0] is available in the AuthModule context.  Potential solutions: - Is AuthModule a valid NestJS module? - If TelegramValidateService is a provider, is it part of the current AuthModule? - If TelegramValidateService is exported from a separate @Module, is that module imported within AuthModule?   @Module({     imports: [ /* the Module containing TelegramValidateService */ ]   })

Error: Nest can't resolve dependencies of the TelegramService (?, PrismaService). Please make sure that the argument TelegramValidateService at index [0] is available in the AuthModule context. Potential solutions: - Is AuthModule a valid NestJS module? - If TelegramValidateService is a provider, is it part of the current AuthModule? - If TelegramValidateService is exported from a separate @Module, is that module imported within AuthModule? @Module({ imports: [ /* the Module containing TelegramValidateService */ ] })

Казалось бы, добавь ты этот TelegramValidateService в этот AuthModule, окей:

@Module({   controllers: [AuthController],   providers: [AuthService, TelegramService, TelegramValidateService], }) export class AuthModule {}

@Module({ controllers: [AuthController], providers: [AuthService, TelegramService, TelegramValidateService], }) export class AuthModule {}

Запускаю, ловлю вторую ошибку:

Error: Nest can't resolve dependencies of the TelegramService (TelegramValidateService, ?). Please make sure that the argument PrismaService at index [1] is available in the AuthModule context.  Potential solutions: - Is AuthModule a valid NestJS module? - If PrismaService is a provider, is it part of the current AuthModule? - If PrismaService is exported from a separate @Module, is that module imported within AuthModule?   @Module({     imports: [ /* the Module containing PrismaService */ ]   })

Error: Nest can't resolve dependencies of the TelegramService (TelegramValidateService, ?). Please make sure that the argument PrismaService at index [1] is available in the AuthModule context. Potential solutions: - Is AuthModule a valid NestJS module? - If PrismaService is a provider, is it part of the current AuthModule? - If PrismaService is exported from a separate @Module, is that module imported within AuthModule? @Module({ imports: [ /* the Module containing PrismaService */ ] })

Тут уже нужно добавить PrismaService в AuthModule:

@Module({   controllers: [AuthController],   providers: [AuthService, TelegramService, TelegramValidateService, PrismaService], }) export class AuthModule {}

@Module({ controllers: [AuthController], providers: [AuthService, TelegramService, TelegramValidateService, PrismaService], }) export class AuthModule {}

Запускаю, все ок.

Но вот тут и мой вопрос, какого я должен делать эти тупые providers еще и такой пачкой, объясняю, PrismaService и AuthModule (которые мне пришлось записать в providers) используются в TelegramService (только его я хочу использовать), почему я не могу просто напросто его засунуть в providers, вот так:

@Module({   controllers: [AuthController],   providers: [AuthService, TelegramService], }) export class AuthModule {}

@Module({ controllers: [AuthController], providers: [AuthService, TelegramService], }) export class AuthModule {}

а должен тянуть эти зависимости, прошу учесть что тут вроде нет никаких круговых зависимостей (Circular dependency).

Вот для наглядности код:
telegram.module.ts

@Module({   imports: [ConfigModule],   controllers: [TelegramController],   providers: [TelegramService, TelegramValidateService, PrismaService],   exports: [TelegramService], }) export class TelegramModule {}

@Module({ imports: [ConfigModule], controllers: [TelegramController], providers: [TelegramService, TelegramValidateService, PrismaService], exports: [TelegramService], }) export class TelegramModule {}

telegram.service.ts (главное это то что он использует внутри себя)

@Injectable() export class TelegramService {   constructor(     private readonly telegramValidateService: TelegramValidateService,     private readonly prismaService: PrismaService   ) {}

@Injectable() export class TelegramService { constructor( private readonly telegramValidateService: TelegramValidateService, private readonly prismaService: PrismaService ) {}

telegram.validate.service.ts

@Injectable() export class TelegramValidateService {   constructor(private readonly configService: ConfigService) {}

@Injectable() export class TelegramValidateService { constructor(private readonly configService: ConfigService) {}

auth.module.ts // ХОТЕЛОСЬ БЫ ТАК

@Module({   controllers: [AuthController],   providers: [AuthService, TelegramService], }) export class AuthModule {}

@Module({ controllers: [AuthController], providers: [AuthService, TelegramService], }) export class AuthModule {}

// РАБОТАЕТ ТОЛЬКО ТАК

@Module({   controllers: [AuthController],   providers: [AuthService, TelegramService, TelegramValidateService, PrismaService], }) export class AuthModule {}

@Module({ controllers: [AuthController], providers: [AuthService, TelegramService, TelegramValidateService, PrismaService], }) export class AuthModule {}

Вот такая у меня непонятка, и проблема, и еще такой вопрос, не менее важный, можно ли делать как я, у меня у одного telegram.module.ts два сервиса: telegram.service.ts и telegram.validate.service.ts.

Ребят прошу, объясните мне этот глупый момент, почему именно так, почему если я уже написал в providers в telegram.module.ts вот так

providers: [TelegramService, TelegramValidateService, PrismaService],

providers: [TelegramService, TelegramValidateService, PrismaService],

и мне захотелось где-то подключить функцию из telegram.service.ts я еще должен тянуть все это например в auth.module.ts вот так:

providers: [AuthService, TelegramService, TelegramValidateService, PrismaService]

providers: [AuthService, TelegramService, TelegramValidateService, PrismaService]

хотя именно в auth.module.ts такие сервисы как - TelegramValidateService, PrismaService не используются, используется только функция с telegram.service.ts которая уже использует TelegramValidateService, PrismaService. Неужели это считается нормой ? Вот так вот тянуть кучу зависимостей ?

Дополнительно:

Лаврентий Маруденко, я про немного другое, то есть смотри в чем мой вопрос. Если я использую сервис в другом сервисе, и этот сервис использует например зависимость "PrismaSlient" мне надо подключать в другой модель этот "PrismaSlient", или достаточно просто подключить сервис который мне нужен, без его зависимостей.

  • blatisgense, решением было - подключать не сервис, а module.
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Максим Павлов Ответ

    Для импорта и экспорта сервисов в NestJS правильно следует использовать декораторы `@Injectable()` и `@Module()`.

    Для импорта сервиса в другой модуль, вам необходимо сначала объявить сервис с помощью декоратора `@Injectable()`. Например, создадим сервис `MyService`:

    @Injectable()
    export class MyService {
      // Ваш код здесь
    }

    @Injectable() export class MyService { // Ваш код здесь }

    Далее, в модуле, в котором вы хотите использовать этот сервис, вам необходимо импортировать его и добавить его в массив `providers` декоратора `@Module()`. Например:

    @Module({
      providers: [MyService],
      exports: [MyService],
    })
    export class MyModule {}

    @Module({ providers: [MyService], exports: [MyService], }) export class MyModule {}

    Теперь вы можете использовать сервис `MyService` в других модулях, импортировав `MyModule` в эти модули.

    Чтобы экспортировать сервис из модуля, вам также нужно добавить его в массив `exports` декоратора `@Module()`. Это позволит другим модулям импортировать этот сервис и использовать его в своем контексте.

    Надеюсь, эта информация поможет вам правильно импортировать и экспортировать сервисы в NestJS. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно