Совместное использование сервисов в модулях nestjs

Я работаю над личным проектом, в котором я следую шаблону репозитория и внедряю репозитории в свои службы (я не использую typeorm, я использую prisma). Теперь я столкнулся с проблемой, когда в модуле аутентификации я хочу получить доступ к данным с помощью usersService, который экспортируется в мой usersModule, и мой модуль аутентификации также импортирует usersModule, но он всегда дает ошибку, что гнездо не может разрешить зависимость usersService в authService. Можете ли вы помочь мне с этой проблемой?

пользователи.service.ts:

import { Inject, Injectable } from "@nestjs/common";
import { CreateUserDto } from "./dto/create-user.dto";
import { IUserRepository } from "./user.types";
import { TYPES } from "../app.types";
import { UserOutput } from "./dto/user.output";

@Injectable()
export class UsersService {
  constructor(
    @Inject(TYPES.User) private readonly userRepository: IUserRepository
  ) {}

  async create(data: CreateUserDto): Promise<UserOutput | null> {
    return await this.userRepository.createUser(data);
  }
}

пользователи.repository.ts:

import { HttpStatus, Injectable } from "@nestjs/common";
import { PrismaService } from "../prisma/prisma.service";
import { CreateUserDto } from "./dto/create-user.dto";
import { UserOutput } from "./dto/user.output";
import { IUserRepository } from "./user.types";
import { ConfigService } from "@nestjs/config";
import { IEnv } from "../env.types";
import { HttpException } from "@nestjs/common";

@Injectable()
export class UserRepository implements IUserRepository {
  constructor(
    private readonly prismaService: PrismaService,
    private readonly configService: ConfigService<IEnv>
  ) {}

  async createUser(data: CreateUserDto): Promise<UserOutput> {
    let { userName, password } = data;
    try {
      const user = await this.prismaService.user.findFirst({
        where: { userName: userName },
      });
      if (user) {
        throw new HttpException(
          "User Already Exists",
          HttpStatus.UNPROCESSABLE_ENTITY
        );
      }
      const userCreated = await this.prismaService.user.create({
        data: { userName: userName, password: hashedPassword as any },
      });
    } catch (e) {
      console.log(e);
      throw e;
    }


}

пользователи.module.ts

import { Module } from "@nestjs/common";
import { UsersService } from "./users.service";
import { UsersController } from "./users.controller";
import { TYPES } from "../app.types";
import { UserRepository } from "./users.repository";

@Module({
  controllers: [UsersController],
  providers: [
    UsersService,
    {
      provide: TYPES.User,
      useClass: UserRepository,
    },
  ],
  exports: [UsersService],
})
export class UsersModule {}

auth.module.ts:

import { Global, Module } from "@nestjs/common";
import { UsersModule } from "../users/users.module";
import { ValidateService } from "./validate.token.service";

@Global()
@Module({
  imports: [UsersModule],
  providers: [ValidateService],
  exports: [ValidateService],
})
export class AuthModule {}

auth.service.ts:

import { Injectable, UnauthorizedException } from "@nestjs/common";
import { Request } from "express";
import { ConfigService } from "@nestjs/config";
import { IEnv } from "../env.types";
import jwt from "jwt-simple";
import { UsersService } from "../users/users.service";

@Injectable()
export class AuthService {
  constructor(
    private readonly userService: UsersService,
    private readonly configService: ConfigService<IEnv>
  ) {}
  async verifyToken(request: Request): Promise<boolean> {
    const token = request.headers.authorization;
    if (!token) throw new UnauthorizedException();
    try {
      const secretKey = this.configService.get("SECRET_KEY");
      const payload = jwt.decode(token, secretKey);
      const user = await this.userService.findOne(payload.sub);
      if (user) {
        return true;
      }
      return false;
    } catch (e) {
      return false;
    }
  }
}

кстати, TYPES.user = Symbol('Пользователь')

поделитесь с нами сообщением об ошибке.

Micael Levi 10.04.2022 03:16
Формы 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.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
1
19
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

В этом случае они обычно рекомендуют использовать впередRef для обхода круговой зависимости.

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