Как импортировать | экспортировать services в NestJS правильно?
И так... у меня есть приложение на 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", или достаточно просто подключить сервис который мне нужен, без его зависимостей.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для импорта и экспорта сервисов в NestJS правильно следует использовать декораторы `@Injectable()` и `@Module()`.
Для импорта сервиса в другой модуль, вам необходимо сначала объявить сервис с помощью декоратора `@Injectable()`. Например, создадим сервис `MyService`:
@Injectable() export class MyService { // Ваш код здесь }
Далее, в модуле, в котором вы хотите использовать этот сервис, вам необходимо импортировать его и добавить его в массив `providers` декоратора `@Module()`. Например:
@Module({ providers: [MyService], exports: [MyService], }) export class MyModule {}
Теперь вы можете использовать сервис `MyService` в других модулях, импортировав `MyModule` в эти модули.
Чтобы экспортировать сервис из модуля, вам также нужно добавить его в массив `exports` декоратора `@Module()`. Это позволит другим модулям импортировать этот сервис и использовать его в своем контексте.
Надеюсь, эта информация поможет вам правильно импортировать и экспортировать сервисы в NestJS. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их.