【问题标题】:Sharing services across nestjs modules跨 Nestjs 模块共享服务
【发布时间】:2022-08-08 21:02:25
【问题描述】:

我正在从事一个个人项目,我遵循存储库模式并将存储库注入我的服务(我不使用 typeorm,我使用 prisma)。现在我遇到了一个问题,在身份验证模块中我想通过使用 usersService 访问数据,该服务在我的 usersModule 中导出,并且我的身份验证模块也导入 usersModule,但它总是给出错误nest 无法解析 authService 中 usersService 的依赖关系。你们能帮我解决这个问题吗?

users.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);
  }
}

users.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;
    }


}

users.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(\'User\')

  • 与我们分享错误消息。

标签: nestjs


【解决方案1】:

在这种情况下,他们通常建议使用forwardRef 来解决循环依赖问题。

【讨论】:

    【解决方案2】:

    我没有通过在他的代码中添加 forwardRef 来解决这个问题。这仅适用于循环依赖权。在他的场景中,即使他在导入中导入了他的模块,他也无法访问这些服务。任何人都可以详细说明这一点。我也经常面临这个问题。我不想重复我的代码。

    根据nest js“如果我们导入一个模块,我们就可以访问它的服务”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      相关资源
      最近更新 更多